渲染到帧缓冲和屏幕

时间:2013-04-23 08:02:43

标签: opengl framebuffer

我正在尝试渲染到fbo,然后使用该纹理作为我的第二个渲染过程的输入以进行后期处理,但似乎glClearglClearColor会影响已渲染的纹理至。如何使它们只影响显示缓冲区?

我的代码看起来像这样:

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

1 个答案:

答案 0 :(得分:1)

如果我必须做出有根据的猜测,你就会定义你的纹理来使用mipmap缩小过滤。使用FBO渲染到纹理后,只定义了一个mipmap级别。但是如果没有选择所有选择的mipmap级别,纹理将不完整,并且不会传递数据。最简单的解决方案是通过设置缩小过滤器参数

来禁用此纹理的mipmapping
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

此外,您必须确保正确解除绑定并绑定附加到FBO的纹理。

  • 在绑定FBO之前取消绑定纹理(您可以安全地将其连接到它上面)。

  • 在将纹理绑定为渲染图像源之前取消绑定FBO。

添加这两个更改(绑定顺序和mipmap级别)应该会使纹理显示。