Opengl 纹理初始化过程

Opengl texture initialization process

本文关键字:过程 初始化 纹理 Opengl      更新时间:2023-10-16

我有一个简单的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 行的目的是什么。我的意思是,我已经阅读了数据。我是否使用以下 4 行将数据放入 gTextureSphere 变量中?我想这是不可能的,因为gTextureSphere是一个GLuint类型的变量。谁能解释我?

现在,我想知道,遵循 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现在有自己的副本。