OpenGL中glActiveTexture和GL_TEXTURE0的功能是什么?

OpenGL中glActiveTexture和GL_TEXTURE0的功能是什么?,opengl,opengl-es,Opengl,Opengl Es,我正在寻找一种方法来理解为什么需要glActiveTexture。我的代码如下: glGenTextures(1, &textureId); glBindTexture(GL_TEXTURE_2D, textureId); 如果我想象GL_TEXTURE\u 2D是挂在墙上的图片框架,而textureId是真实图片,那么glBindTexture是将真实图片分配给框架的唯一命令,那么GL_TEXTURE0和glActiveTexture是什么 下面的代码可以正常工作吗 glActive

我正在寻找一种方法来理解为什么需要
glActiveTexture
。我的代码如下:

glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
如果我想象
GL_TEXTURE\u 2D
是挂在墙上的图片框架,而
textureId
是真实图片,那么
glBindTexture
是将真实图片分配给框架的唯一命令,那么
GL_TEXTURE0
glActiveTexture
是什么

下面的代码可以正常工作吗

glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);

glActiveTexture(GL_TEXTURE1);
glTexImage2D(GL_TEXTURE_2D, .....)
glTexParameteri(GL_TEXTURE_2D, ...)
我目前正在使用OpenGL2.1

如果我想象GL_TEXTURE_2D是挂在墙上的画框,textureId是真实的图片

其实是一个很好的比喻:)

那么,什么是GL_TEXTURE0和glActiveTexture


想象一下有多个画框的墙,第一个画框被标记为GL_TEXTURE0,第二个画框被标记为GL_TEXTURE1,依此类推。

OpenGL在某个点引入了多纹理(基本上是在一个几何体过程中使用多个纹理);为了让旧代码继续工作,他们不能只向所有函数添加额外的参数。这就是为什么您必须明确指定要寻址的纹理单元。

因此,在设置纹理(
glTexParrameteri
glTexImage2D
,…)时,我们是否需要调用
glActiveTexture
,因为在glTexImage2D中没有参数来说明您是在谈论GL_TEXTURE0还是GL_TEXTURE1。@datenwolf:还有一个问题:D:如果我在片段着色器中使用多个纹理(即
uniform sampler2D tex1;uniform sampler2D tex2;…
那么我如何称呼
glActiveTexture
?@BìnhNguyên:您使用glActiveTexture单元将“图像”放入它们的“单元”帧
GL\u TEXTURE0+n
,在着色器中,您将采样器设置为仅值
n
。是的,这是不一致的,但谁在乎呢?只需将
GL\u TEXTURE0+
放入
glactivateTexture
的所有调用中,这没什么大不了的。那么,我们需要调用
glEnable(GL\u TEXTURE\u 2D)
还是
glEnable(GLìu纹理_立方体_贴图)
,在新OpenGL版本(2.1+)中使用它们之前?嗯,是的,因为每个纹理单元可以是以前版本中的任何类型。@BìnhNguyên:只有在使用固定函数管道的情况下。如果使用着色器,纹理采样的使用由着色器程序决定。