我有一个简单的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类型的变量。有人能解释一下吗?
答案 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现在有自己的副本。