繁体   English   中英

OpenGL只能绑定到GL_TEXTURE0

[英]OpenGL can only bind to GL_TEXTURE0

我试图将多个纹理绑定到我的着色器,但是当我使用除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检查状态时,一切似乎都很好。 但事实并非如此。

我终于找到了错误,我不得不犯下一个真正的初学者错误。 很难相信没有人发现此错误。 我认为一个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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM