zoukankan      html  css  js  c++  java
  • glGenTextures

    http://blog.sina.com.cn/s/blog_67ede2d80100w3i8.html

    glGenTextures(GLsizei n, GLuint *textures)函数说明

     

      n:用来生成纹理的数量

     

      textures:存储纹理索引的

     

      glGenTextures函数根据纹理参数返回n个纹理索引。纹理名称集合不必是一个连续的整数集合。

     

      (glGenTextures就是用来产生你要操作的纹理对象的索引的,比如你告诉OpenGL,我需要5个纹理对象,它会从没有用到的整数里返回5个给你)

     

      glBindTexture实际上是改变了OpenGL的这个状态,它告诉OpenGL下面对纹理的任何操作都是对它所绑定的纹理对象的,比如glBindTexture(GL_TEXTURE_2D,1)告诉OpenGL下面代码中对2D纹理的任何设置都是针对索引为1的纹理的。

     

      产生纹理函数假定目标纹理的面积是由glBindTexture函数限制的。先前调用glGenTextures产生的纹理索引集不会由后面调用的glGenTextures得到,除非他们首先被glDeleteTextures删除。你不可以在显示列表中包含glGenTextures。

     

    void glGenTextures(GLsizei n, GLuint *texture);

    该函数用来产生纹理名称。这里纹理名称GLuint *texture是整型的,因此也可以理解为这个函数为这n个纹理指定了n个不同的ID。

    在用GL渲染的时候,纹理是很常见的东西。使用纹理之前,必须执行这句命令为你的texture分配一个ID,然后绑定这个纹理,加载纹理图像,这之后,这个纹理才可以使用。加载纹理的代码如下:

    BOOL LoadTextures(IplImage *pImage, GLuint *pTexture)
    {
        int Status=FALSE;
        if(pImage != NULL)
        {
            Status=TRUE;

            glGenTextures(1, &pTexture[0]); //注意这里
            glBindTexture(GL_TEXTURE_2D, pTexture[0]);
            glTexImage2D(GL_TEXTURE_2D, 0, 3,
                         pImage->width, pImage->height,
                         0, GL_BGR, GL_UNSIGNED_BYTE, (unsigned char *)pImage->imageData);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        }
        return Status;
    }

        使用上面这个函数时需要小心,这个函数只能放在循环外面使用!如果你想在循环中重复利用这个texture[0],给它加载不同的纹理(比如,你想在窗口中显示序列图像),而把这个函数放在循环内部调用的话,那么当程序循环足够多次之后,你的电脑将变得巨慢无比,甚至导致死机。原因就是反复地调用glGenTextures(1, &pTexture[0])。这个问题产生的机制我并不清楚,但是我今天实实在在的遇到了。

        所以,上面这个函数一般都是放在循环外面,窗口初始化的时候,用于给背景加载纹理。那么,如果我必须要在循环中渲染序列帧的话,该怎么做呢?我们可以对上面的函数加一点小小的改变,如下:

    BOOL LoadTextures(IplImage *pImage, GLuint texture)
    {
        int Status=FALSE;
        if(pImage != NULL)
        {
            Status=TRUE;
            glBindTexture(GL_TEXTURE_2D, texture);
            glTexImage2D(GL_TEXTURE_2D, 0, 3,
                         pImage->width, pImage->height,
                         0, GL_BGR, GL_UNSIGNED_BYTE, (unsigned char *)pImage->imageData);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        }
        return Status;
    }

    在窗口初始化的时候先执行一遍:

    glGenTextures(1, &texture[0]);

    然后在你的循环内部调用:

    IplImage *videoFrame = cvQueryFrame(capture);

    LoadTextures(videoFrame, texture[0]);

    这样就可以显示图像帧了,也不会再出现电脑运行速度变慢的问题了。总之,千万不要给一个texture重复分配ID。

        我自己写的这个LoadTextures函数提供了图像buffer的接口,可以从外面读取视频帧并传给这个函数,绑定纹理, 使用起来比较灵活。

  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/xuejinhui/p/4383703.html
Copyright © 2011-2022 走看看