我正在尝试将多个纹理绑定到我的着色器,但是当我使用除GL_TEXTURE0
之外的其他枚举时,我的着色器显示不可预测的行为(例如,所有inout变量都为零)。
这就是我如何绑定纹理(在其他项目中完美地工作)
glActiveTexture(GL_TEXTURE0);
sceneTex->bind();
glActiveTexture(GL_TEXTURE1);
depthTex->bind();
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
VBO->bind(GL_ARRAY_BUFFER);
unsigned int stride = 2 * sizeof(float) + 2 * sizeof(float);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, stride, (void*)0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, stride, (void*)(2 * sizeof(float)));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
VBO->unbind(GL_ARRAY_BUFFER);
glActiveTexture(GL_TEXTURE0);
sceneTex->unbind();
glActiveTexture(GL_TEXTURE1);
depthTex->unbind();
当我删除glActiveTexture(GL_TEXTURE1)
时,一切正常。当我删除glActiveTexture(GL_TEXTURE0)
时,我仍然遇到问题。如果我尝试使用GL_TEXTURE2
或其他枚举,则会出现同样的问题。
这是我的片段着色器:
#version 440
out vec4 fragColor;
layout(binding = 0) uniform sampler2D colorMap;
layout(binding = 1) uniform sampler2D depthMap;
in vec2 texUV;
void main()
{
fragColor = texture(colorMap, texUV) / 2.0 + texture(depthMap, texUV) / 2.0;
}
当我用glGetIntegerv
检查状态时,一切似乎都很好。但事实并非如此。
答案 0 :(得分:1)
我终于找到了错误,我必须承诺我犯了一个真正的初学者错误。很难相信没有人发现这个错误。
我认为glEnable(GL_TEXTURE_2D)
的一次调用对于所有纹理槽都足够了,但是我发现它你必须为你拥有的每个活动纹理调用glEnable(GL_TEXTURE_2D)
。所以正确的代码如下所示:
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
sceneTex->bind();
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
depthTex->bind();
// draw some stuff
glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D)
sceneTex->unbind();
glActiveTexture(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D)
depthTex->unbind();