我有一个opengl上下文,我在其中渲染了几个线框基元。我想在一些(不是全部)上应用一些后期处理效果(例如模糊,绽放)。为了实现这一点,我已经定义了一个带有附加纹理(colorbuffer)和renderbuffer(depthbuffer)的屏幕外帧缓冲区。然后,我执行以下操作:
绘制不应进行后处理的其他原语
设置正视图
绘制全屏四边形
显示mainframebuffer的内容
问题是,通过将纹理渲染到屏幕外缓冲区并将结果用作2D四边形的纹理,我丢失了深度信息,整个场景看起来并不真实。
所以我的问题是,如何将我的深度缓冲区合并到帧缓冲区?或者将模糊或其他碎片整理效果应用于复杂的3D场景的常用方法是什么?
答案 0 :(得分:2)
具体解决这个问题:
所以我的问题是,如何合并我的深度缓冲区 帧缓冲区?
如果它们是纹理(通过glFramebufferTexture2D
),则无法阻止您在不同FBO之间共享附件。这甚至适用于深度/深度模板缓冲区。在GL3中,使用不同尺寸的附件甚至是有效的。
如果您在稍后阶段需要主帧缓冲区(可见窗口)中的深度信息,则可以使用Framebuffer Blitting进行复制。一个blit操作非常快。
渲染顺序的方法有很多种。个人偏好/灵活性/表现。我个人尽可能地在FBO中做,因为灵活性和以后需要时进行优化。最终的颜色结果也通过blit移动到帧缓冲区。
我在某些Linux驱动程序上以及在某些情况下在OS X下共享深度附件(或一般附件)时遇到了问题,最终使用blit而不是共享深度附件也很成功。
答案 1 :(得分:0)
我会使用早期深度测试来实现这一点。我们的想法是,您首先将整个场景渲染到深度缓冲区中,即没有颜色写入。接下来,您将执行颜色传递,在此处禁用深度写入,并使用完全相同的变换对相等性进行深度测试。这为您提供了所需的隐藏表面移除。颜色是否像您已经概述的那样通过。现在通过覆盖模糊的图片它应该看起来没问题(有一些病理情况可能会破坏,但这些可能会使用一些模板缓冲技巧来修复)。
顺便说一句,您不需要为全屏四顶点着色器设置投影。只需穿过顶点位置并使用坐标(-1,-1)(1,-1)(1,1)( - 1,1)作为顶点。