在OpenGL中从Shader读取多个纹理单元的问题

时间:2011-02-16 00:00:49

标签: c++ opengl glsl

我试图在我的着色器中读取两个不同的纹理,一个用于常规纹理,一个用于凹凸贴图。然而,两个Sampler2D都从相同的纹理单元读取。我将制服设置为0和1然而,我将纹理绑定到各自的单位,如下所示:

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texMgr->GetTexture("stone")->texture);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texMgr->GetTexture("bump")->texture);

在我的渲染循环中,我按照以下方式设置制服:

shaderMgr->activeProgram()->setUniform1f("tex", 0);
shaderMgr->activeProgram()->setUniform1f("norm", 1);

最后是我的着色器代码:

varying vec4 colorVarying;
varying vec4 normalVarying;
varying vec3 lightDirVarying;
varying vec2 textureCoordinateVarying;

uniform sampler2D tex;
uniform sampler2D norm;

void main() {    
    vec4 texColor = texture2D(tex, textureCoordinateVarying);
    vec4 normColor = texture2D(norm, textureCoordinateVarying);
    vec3 newNormal = vec3(2.0 * normColor.x - 1.0, 2.0 * normColor.y - 1.0, 2.0 * normColor.z - 1.0);
    vec3 normal = normalize(normalVarying.xyz + newNormal);
    float diff = max(0.0, dot(normal, normalize(lightDirVarying)));

    gl_FragColor = texColor * (diff + 0.3);
}

每次绘制一个Object时,我只在renderloop中调用glActiveTexture,而且我只调用一次glActiveTexture(GL_TEXTURE1)(在我的初始化中)。

glActiveTexture(GL_TEXTURE0);
glBindTexture( GL_TEXTURE_2D, object->tex->texture);

第一个纹理的一切正常,但第二个纹理(凹凸)没有出现。我试过了:

  • 将ARB添加到所有内容中,我不确定这是否重要。 (如果有任何用途,我使用的是OSX 10.6)
  • 每次切换纹理单位时都添加glEnable(GL_TEXTURE_2D)。
  • 不在程序之间切换,只使用一个着色器运行,并在初始化中设置制服
  • 每次切换纹理单位时重置纹理参数。
  • 不在TextureUnits之间切换,只在开始时初始化它们
  • 开始一个新项目,只复制相关代码并运行它,保持尽可能小

所有这些都没有用,标准采样器只是读取GL_TEXTURE0单元。

我现在一直在寻找几个小时,但我还没有找到答案。我不知道我做错了什么以及为什么我的标准采样器没有从正确的GL_TEXTURE1单元读取。

1 个答案:

答案 0 :(得分:5)

shaderMgr->activeProgram()->setUniform1f("tex", 0);

如果这是调用glUniform1f,那就错了,你必须使用glUniform1i来设置纹理采样器。