Opengl 如何将图像后处理着色器的结果添加到场景中

Opengl 如何将图像后处理着色器的结果添加到场景中,opengl,glsl,shader,framebuffer,Opengl,Glsl,Shader,Framebuffer,我有一个opengl环境,在这里我渲染了几个线框原语。我想对其中一些(不是全部)应用一些后期处理效果(例如模糊、开花)。为了实现这一点,我定义了一个带有附加纹理(colorbuffer)和renderbuffer(depthbuffer)的屏幕外帧缓冲区。然后,我做以下工作: 绑定屏幕外缓冲区 设置透视图 绘制要模糊的线框基本体 解除屏幕外帧缓冲区的绑定并绑定“主”帧缓冲区 进一步绘制不应进行后处理的基本体 设置正交视图 设置后处理着色器,将屏幕外缓冲区的纹理作为统一参数传递 画一个全屏的四边形

我有一个opengl环境,在这里我渲染了几个线框原语。我想对其中一些(不是全部)应用一些后期处理效果(例如模糊、开花)。为了实现这一点,我定义了一个带有附加纹理(colorbuffer)和renderbuffer(depthbuffer)的屏幕外帧缓冲区。然后,我做以下工作:

  • 绑定屏幕外缓冲区
  • 设置透视图
  • 绘制要模糊的线框基本体
  • 解除屏幕外帧缓冲区的绑定并绑定“主”帧缓冲区
  • 进一步绘制不应进行后处理的基本体

  • 设置正交视图

  • 设置后处理着色器,将屏幕外缓冲区的纹理作为统一参数传递
  • 画一个全屏的四边形

  • 显示主帧缓冲区的内容

  • 问题是,通过将纹理渲染到屏幕外缓冲区并将结果用作2D四边形的纹理,我失去了深度信息,整个场景看起来不真实


    所以我的问题是,如何将我的深度缓冲区合并到帧缓冲区?或者,将模糊或其他碎片着色器效果应用于复杂3D场景的常见方法是什么?

    我会使用早期深度测试来实现这一点。其思想是,首先只将整个场景渲染到深度缓冲区中,即不进行颜色写入。接下来进行颜色传递,禁用深度写入,并使用完全相同的转换进行相等深度测试。这将为您提供所需的隐藏曲面删除。颜色是否像您已经概述的那样通过。现在,通过叠加模糊的图片,它看起来应该是正常的(有一些病理情况下,这可能会打破,但这些可能是固定使用一些模具缓冲欺骗)


    顺便说一句,您不需要为全屏四顶点着色器设置投影。只需穿过顶点位置,并使用坐标(-1,-1)(1,-1)(1,1)(-1,1)作为顶点。

    要专门解决此问题:

    所以我的问题是,如何合并我的to的depthbuffers 帧缓冲区

    如果附件是纹理(通过
    glFramebufferTexture2D
    ),则没有任何东西可以阻止您在不同FBO之间共享附件。这甚至适用于深度/深度模具缓冲区。在GL3中,甚至可以使用不同大小的附件

    如果以后需要主帧缓冲区(可见窗口)中的深度信息,可以使用来复制它。blit操作真的很快

    有许多方法可以实现渲染顺序。个人偏好/灵活性/表现。我个人在FBO中尽可能多地使用它,因为它具有灵活性,如果需要,可以在以后进行优化。最终的颜色结果也通过blit移动到帧缓冲区

    我在一些linux驱动程序上以及在某些情况下在OS X下共享深度附件(或一般的附件)时遇到问题,最终使用blit而不是共享深度附件,并取得了巨大成功