我正在尝试渲染到fbo,然后使用该纹理作为我的第二个渲染过程的输入以进行后期处理,但似乎glClear
和glClearColor
会影响已渲染的纹理至。如何使它们只影响显示缓冲区?
我的代码看起来像这样:
UseRenderingShaderProgram();
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderWorld();
// render to screen
UsePostProcessingShaderProgram();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClearColor(0.0, 0.0, 0.0, 1.0); // <== texture appears to get cleared in this two lines.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderWorld();
glfwSwapBuffers();
答案 0 :(得分:1)
如果我必须做出有根据的猜测,你就会定义你的纹理来使用mipmap缩小过滤。使用FBO渲染到纹理后,只定义了一个mipmap级别。但是如果没有选择所有选择的mipmap级别,纹理将不完整,并且不会传递数据。最简单的解决方案是通过设置缩小过滤器参数
来禁用此纹理的mipmappingglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
此外,您必须确保正确解除绑定并绑定附加到FBO的纹理。
在绑定FBO之前取消绑定纹理(您可以安全地将其连接到它上面)。
在将纹理绑定为渲染图像源之前取消绑定FBO。
添加这两个更改(绑定顺序和mipmap级别)应该会使纹理显示。