我在OpenGL 2.1
中读过一份纹理示例,其中片元着色器如下:
#version 120
uniform sampler2D texture;
varying vec2 texcoord;
void main(void)
{
gl_FragColor = texture2D(texture, texcoord);
}
从顶点着色器传递了texcoord
。
使用以下C++渲染代码:
void render()
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glUniform1i(unf_texture, 0);
}
我对某些事情感到困惑,有一些问题:
在片段着色器中,纹理被传递了一个零值(通过
glUniform1i()
)。这个值真的是零吗?这个值是其他值吗?真的需要调用
glActiveTexture()
吗?为什么在
glUniform1i()
中传递一个零值?
glActiveTexture
。这样,当你突然需要使用多个纹理时,就不会出现错误。 - Nicol BolasglActiveTexture()
来提示OpenGL状态机,你在之后调用的纹理状态函数(例如glBindTexture()
)适用于指定的纹理索引,并且你在这里使用GL_TEXTURE0
到例如GL_TEXTURE8
的预处理器常量来完成这个过程(将硬件TIU分配给你指定的纹理)。至于设置uniforms(我仍在寻找相关文档),你需要将其设置为与TIU编号相对应的整数,以便uniform sampler的着色器变量进行采样。 - Steven LuglActiveTexture
肯定有作用:它会改变当前纹理单元索引,所有纹理绑定函数都会引用它。 - Nicol Bolas