Opengl纹理初始化过程

时间:2014-12-08 14:04:59

标签: c++ opengl textures

我有一个简单的openGL问题,目前我正在尝试学习纹理,这是我对此感到困惑的部分:

void initTextures()
{   
   GLuint gTextureSphere;
   int width, height, channels = 1;
    unsigned char* textureMapData = SOIL_load_image("res/texturemap.jpg", &width, &height, 0, SOIL_LOAD_RGB);

    //texture map
    glGenTextures(1,&gTextureSphere);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,gTextureSphere);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureMapData);

    SOIL_free_image_data(textureMapData);
    glUniform1i(glGetUniformLocation(gProgramSphere, "normalTexture"), 0);
    ////////////////////////

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}

我认为上面的代码通过SOIL_load_image函数读取我的图像“texturemap.jpg”并将其存储在textureMapData变量中。现在,我想知道,遵循4行的目的是什么。我的意思是,我已经阅读了数据。我是否将这些数据放入gTextureSphere变量中以及以下4行?我想这是不可能的,因为gTextureSphere是一个GLuint类型的变量。有人能解释一下吗?

1 个答案:

答案 0 :(得分:1)

  

现在,我想知道,遵循4行的目的是什么。

到目前为止,纹理数据仅被加载到程序的地址空间中。但是OpenGL,渲染器API并没有“神奇地”了解该数据的可用性。让我们分解一下:

首先生成一个我们与OpenGL交谈的OpenGL句柄,以便它知道我们正在谈论的纹理对象。生成的句柄将存储在变量gTextureSphere

glGenTextures(1,&gTextureSphere);

OpenGL有几个“插件”,称为纹理单元,纹理对象可以“连接到”。这告诉OpenGL,纹理单元0(GL_TEXTURE0)上应该发生以下操作:

glActiveTexture(GL_TEXTURE0);

接下来在刚刚选择的纹理单元和纹理对象之间建立连接,OpenGL达成协议,通过变量gTextureSphere中包含的值进行调用。

glBindTexture(GL_TEXTURE_2D,gTextureSphere);

现在OpenGL知道,我们正在谈论纹理单元0和要插入的某个纹理,我们可以告诉它用纹理对象做某些事情。例如,复制图像数据,从文件中读取并解码到某个缓冲区中。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureMapData);

此时,OpenGL有一个纹理对象,其中包含图像数据的工作副本;我们现在可以安全地释放我们用于解码图像文件的缓冲区,因为OpenGL现在有自己的副本。