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的接口,可以从外面读取视频帧并传给这个函数,绑定纹理, 使用起来比较灵活。

  • 相关阅读:
    tcp/ip协议listen函数中backlog參数的含义
    oracle exp实例
    js21---单体(单例)模式
    js20---接口3种方式
    js19--继承终极版本
    js18--继承方式
    js17---创建对象:构造函数式和原型组合模式、动态原型模式、稳妥构造函数式
    js16--自定义原型对象
    js---15,模拟数组的ecah方法
    js14--原型2
  • 原文地址:https://www.cnblogs.com/xuejinhui/p/4383703.html
Copyright © 2011-2022 走看看