c++ - OpenGL 只能绑定(bind)到 GL_TEXTURE0

标签 c++ opengl textures shader

我正在尝试将多个纹理绑定(bind)到我的着色器,但是当我使用 GL_TEXTURE0 以外的其他枚举时,我的着色器显示出不可预测的行为(例如,所有 inout 变量都变为零)。 这就是我绑定(bind)纹理的方式(在其他项目中效果很好)

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();

关于c++ - OpenGL 只能绑定(bind)到 GL_TEXTURE0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25996907/

相关文章:

c++ - 如何在编译时推断出两种类型共有的继承树的根(如果存在)?

c++ - 纹素中心的采样没有给出正确的结果,OpenGL,C++

android - 不同手机上的 OpenGL ES 纹理原点从上/左到下/左不同

c++ - OpenGL:使用 2500*2500 像素的纹理是否可以接受?

java - glBufferData 生成 GL_INVALID_OPERATION

graphics - 从 d3d11 中的渲染目标读取像素数据

c++ - 线程抛出异常后出现"Bad promise"错误

c++ - OpenSSL AES 128 CBC\0 崩溃加密字符*

c++ - 打印 boost 属性树生成的 xml

c++ - glBufferData 不在主函数之外工作