我试图在我的着色器中读取两个不同的纹理,一个用于常规纹理,一个用于凹凸贴图。然而,两个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);
第一个纹理的一切正常,但第二个纹理(凹凸)没有出现。我试过了:
所有这些都没有用,标准采样器只是读取GL_TEXTURE0单元。
我现在一直在寻找几个小时,但我还没有找到答案。我不知道我做错了什么以及为什么我的标准采样器没有从正确的GL_TEXTURE1单元读取。
答案 0 :(得分:5)
shaderMgr->activeProgram()->setUniform1f("tex", 0);
如果这是调用glUniform1f,那就错了,你必须使用glUniform1i来设置纹理采样器。