sampler2D存储什么?

43

我在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);
}

我对某些事情感到困惑,有一些问题:

  1. 在片段着色器中,纹理被传递了一个零值(通过 glUniform1i())。这个值真的是零吗?这个值是其他值吗?

  2. 真的需要调用 glActiveTexture() 吗?

  3. 为什么在 glUniform1i() 中传递一个零值?

1个回答

43

sampler2D绑定到一个纹理单元glUniform调用将其绑定到纹理单元零。如果您要使用多个纹理单元,则只需要调用glActiveTexture()(因为GL_TEXTURE0已经是默认值)。


30
你应该养成一个习惯,总是调用 glActiveTexture。这样,当你突然需要使用多个纹理时,就不会出现错误。 - Nicol Bolas
请澄清一下,是不是意味着每一个可以用同一个"GL_TEXTURE0"绑定的纹理(1D、2D、3D)都必须传递相同的值(0)给sampler1D/2D/3D?而分配在"GL_TEXTURE1"下的纹理需要在着色器内的uniform中传递值1吗? - Chris
1
所以(如果我错了请纠正),文档解释的方式是使用glActiveTexture()来提示OpenGL状态机,你在之后调用的纹理状态函数(例如glBindTexture())适用于指定的纹理索引,并且你在这里使用GL_TEXTURE0到例如GL_TEXTURE8的预处理器常量来完成这个过程(将硬件TIU分配给你指定的纹理)。至于设置uniforms(我仍在寻找相关文档),你需要将其设置为与TIU编号相对应的整数,以便uniform sampler的着色器变量进行采样。 - Steven Lu
@NicolBolas 缺乏这种习惯并且在需要多个纹理时没有“打破世界”并不是互相排斥的。 - Kröw
@Kröw:你说的“它”是什么?glActiveTexture肯定有作用:它会改变当前纹理单元索引,所有纹理绑定函数都会引用它。 - Nicol Bolas
显示剩余28条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接