【问题标题】:Cannot read from a texture when binding to GL_TEXTURE0绑定到 GL_TEXTURE0 时无法从纹理中读取
【发布时间】:2015-08-09 02:08:03
【问题描述】:

我在空闲时间学习使用 OpenGL,现在我正在研究延迟渲染。我已经被这个问题困住了几个星期。当我将漫反射纹理绑定到 GL_TEXTURE0 时,纹理中的每个像素都是 (0.0f, 0.0f, 0.0f, 0.0f)。当我将它切换到 GL_TEXTURE3 时,它可以工作。我应该去哪里调试这个问题?

我将在下面发布绘制调用。

整个源代码都在这个存储库中: https://github.com/DanielSmithMichigan/OpenGLExperimentation

从不同纹理写入和读取的行为发生在这里: https://github.com/DanielSmithMichigan/OpenGLExperimentation/blob/master/OpenGlTest6/Defer.h

绘图调用:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// if I switch GL_TEXTURE0 to GL_TEXTURE3
// and diffuseUniform << 0 to diffuseUniform << 3
// then it will work
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, diffuseTexture);
*diffuseUniform << 0;

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, positionTexture);
*positionUniform << 1;

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, normalsTexture);
*normalsUniform << 2;

*ambientColorUniform << objects->ambientLight->color;
*lightColorUniform << objects->sun->color;
*lightDirectionUniform << objects->sun->direction;
*cameraPositionUniform << objects->camera->position;
*specularColorUniform << objects->sun->color;
*specularPowerUniform << 5.0f;

glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(1, 0);
glVertex3f((float)width, 0.0f, 0.0f);
glTexCoord2f(1, 1);
glVertex3f((float)width, (float)height, 0.0f);
glTexCoord2f(0, 1);
glVertex3f(0.0f, (float)height, 0.0f);
glEnd();

【问题讨论】:

  • 如果使用 GL_TEXTURE1 和 uniform = 0 会怎样?
  • 感谢您的回复 - 无效...纹理最终覆盖了整个屏幕。似乎活动纹理必须与制服相匹配。但我确实发现我可以将漫反射移动到 1,将位置移动到 2,将法线移动到 3,这样就可以了。不过,我仍然不知道为什么 0 不起作用
  • 我在下面的答案中说明了它的工作原理

标签: c++ opengl


【解决方案1】:

我试图用 uniform = 1 说 GL_TEXTURE1

因为我怀疑您在使用 glGenTextures(1, &depthBuffer) 进行漫反射纹理之前制作的纹理,但我不知道您为什么将其命名为 depthBuffer depthbuffer 必须是RBO 之一不是纹理。

不管怎样,

glactivetexture() 的默认值为 GL_TEXTURE0

在调用 glbindtexture(depthBuffer) 之前,您没有调用 glactivetexture(GL_TEXTURE0),尽管因为默认值为 GL_TEXTURE0,您已经将 GL_TEXTURE0 用于 depthBuffer

【讨论】:

  • 感谢您的回答!我不认为这是正确的。我确实找到了解决问题的方法,但不是这样。删除深度缓冲区,或在创建之前使用 glActiveTexture(GL_TEXTURE7) 并不能解决问题。此外,glBindTexture 的文档说“当纹理绑定到目标时,该目标的先前绑定会自动中断。”我将在我自己对我的帖子的回复中描述修复和发生的事情。
【解决方案2】:

问题是在文件 Mesh.h 和 Grid.h 中,我将采样器绑定到索引 0 (GL_TEXTURE0)。当我尝试在索引 0 上绑定/读取漫反射纹理时,该采样器仍然被绑定。

解决方案是在我开始几何传递之前使用 glActiveTexture(GL_TEXTURE0) 和 glEnable(GL_TEXTURE_2D),并在结束后使用相反的 glActiveTexture(GL_TEXTURE0) 和 glDisable(GL_TEXTURE_2D)。

然后在我的延迟渲染对象的绘制调用中,我使用 glBindSampler(0, 0)。

据我所知,上面提到的所有 5 个功能都是必需的。

此问题的解决方法是提交哈希 d60fec483e896971304f5f9f24c4bd0f10fe48fe,供任何需要更多信息的人使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多