渲染到帧缓冲区和屏幕

问题描述:

我想渲染到一个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(); 
+0

*“纹理似乎在这两行中被清除。”* - 事实并非如此,您的错误在别处。 – 2013-04-23 09:45:49

如果我不得不做出一个受过教育的猜你定义你的纹理使用纹理贴图的缩小过滤。使用FBO渲染到纹理后,只定义一个mipmap级别。但是,如果没有选择创建的所有mipmap级别,则纹理不完整并且不会传输数据。最简单的解决方案将通过设置它的微小滤波器参数被禁止用于这种​​质地纹理映射

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

而且你必须确保你正确地解除绑定和绑定纹理被附加到FBO。

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

  • 在将纹理作为图像源进行渲染之前解除FBO的绑定。

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