【发布时间】: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 不起作用
-
我在下面的答案中说明了它的工作原理