在fbo中使用默认的帧缓冲区深度缓冲区

时间:2018-12-10 13:55:16

标签: opengl libgdx framebuffer depth-buffer

我想在我的游戏中的某些演员上实现后期处理轮廓效果,并且希望轮廓被其他靠近相机的演员遮挡。为此,我计划在FBO和轮廓着色器中渲染应该轮廓化的元素。要丢弃被遮挡的像素,我想使用默认帧缓冲区的深度缓冲区。

我阅读并搜索了内容,但没有找到如何在另一个帧缓冲区中正确使用默认帧缓冲区深度缓冲区的方法,或者如何复制或在fbo上使用默认深度缓冲区信息。

我该如何实现?

2 个答案:

答案 0 :(得分:1)

不幸的是,无法将默认深度缓冲区附加到FBO或从着色器读取它。

您可以将默认的帧缓冲区复制到渲染缓冲区(或附加了帧缓冲区的texturem,请参见glBlitFramebuffer),但这可能相对较慢。

另一种选择是先将整个场景渲染到FBO(颜色+深度),然后使用轮廓着色器从该FBO中读取,将结果与轮廓计算结合起来,然后将最终结果写入默认的帧缓冲区。 / p>

答案 1 :(得分:1)

  

我阅读并搜索过,但是没有找到如何在另一个帧缓冲区中正确使用默认帧缓冲区深度缓冲区

不幸的是,OpenGL中无法做到这一点。

  

或者如何复制或仍然使用fbo上的默认深度缓冲区信息。

那很容易。只需创建一个具有适当深度附件的FBO(无论纹理还是渲染缓冲区),然后blit为其设置默认的深度缓冲区即可。

glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, your_target_fbo);
glBlitFramebuffer(0,0,width,height,0,0,width,height,GL_DEPTH_BUFFER_BIT, GL_NEAREST);

但是,由于无论如何都要进行一些后处理,所以将初始场景渲染到FBO中并在不同的FBO中重新使用相同的深度缓冲区可能是一个不错的选择。