在考虑深度的情况下将 FBO 渲染到屏幕
Render FBO to screen taking into account Depth
目标:OpenGL ES 3.0
假设我的默认帧缓冲区(屏幕)已经包含我渲染的部分场景;它的颜色和深度缓冲区包含有效数据。
现在假设我已经将场景的另一部分渲染到中间 FBO 'fbo1'。它的颜色数据保存在纹理 'mColor' 中,它附加到 fbo1.COLOR0 附件,它的深度保存在另一个纹理 'mDepth' 中,它附加到另一个 FBO [=23 的 DEPTH 附件=].
现在我想采用 mColor 并将其渲染到屏幕,同时考虑 mDepth 的深度。我知道如何将仅包含颜色数据的纹理渲染到屏幕,但我不知道如何将 mDepth 考虑在内。
从本质上讲,当我们将带有 mColor 纹理的四边形渲染到屏幕时,我们需要将屏幕的深度缓冲区与来自四边形的深度进行比较,而是与来自 mDepth 的深度进行比较。怎么做?
您可以将 FBO 的深度用作纹理。当您绘制 FBO 的内容时,您绘制颜色通道并从 FBO 的深度纹理手动写入 gl_FragDepth。之后,您可以在启用适当深度测试的情况下绘制所有其他场景内容。
如果您要拆分管道并在与 off-screen 渲染交错的多个通道中渲染 FBO0,那么简单的答案是 "you're doing it wrong"。
你强迫 GPU 写出 read-back 你的中间状态,这是非常低效的,特别是在具有 tile-based 架构的移动设备上。
先渲染每个 off-screen 通道,然后渲染 window 表面 (FBO0) 一次完成。
We need to compare the Screen's depth buffer not with the depth from the Quad, but with depth from mDepth. How to do that?
从深度纹理加载深度值,并将该值分配给片段着色器中的 gl_FragDepth
。但是,这将强制所有片段进行 late-zs 深度更新,与在 early-zs 处使用真实三角形 z-value 相比,这非常慢,因为您必须 运行 着色器在确定是否需要保留片段之前。因此,根据上述内容,我建议重新设计您的渲染管道,这样您就不需要这样做了...
目标:OpenGL ES 3.0
假设我的默认帧缓冲区(屏幕)已经包含我渲染的部分场景;它的颜色和深度缓冲区包含有效数据。
现在假设我已经将场景的另一部分渲染到中间 FBO 'fbo1'。它的颜色数据保存在纹理 'mColor' 中,它附加到 fbo1.COLOR0 附件,它的深度保存在另一个纹理 'mDepth' 中,它附加到另一个 FBO [=23 的 DEPTH 附件=].
现在我想采用 mColor 并将其渲染到屏幕,同时考虑 mDepth 的深度。我知道如何将仅包含颜色数据的纹理渲染到屏幕,但我不知道如何将 mDepth 考虑在内。
从本质上讲,当我们将带有 mColor 纹理的四边形渲染到屏幕时,我们需要将屏幕的深度缓冲区与来自四边形的深度进行比较,而是与来自 mDepth 的深度进行比较。怎么做?
您可以将 FBO 的深度用作纹理。当您绘制 FBO 的内容时,您绘制颜色通道并从 FBO 的深度纹理手动写入 gl_FragDepth。之后,您可以在启用适当深度测试的情况下绘制所有其他场景内容。
如果您要拆分管道并在与 off-screen 渲染交错的多个通道中渲染 FBO0,那么简单的答案是 "you're doing it wrong"。
你强迫 GPU 写出 read-back 你的中间状态,这是非常低效的,特别是在具有 tile-based 架构的移动设备上。
先渲染每个 off-screen 通道,然后渲染 window 表面 (FBO0) 一次完成。
We need to compare the Screen's depth buffer not with the depth from the Quad, but with depth from mDepth. How to do that?
从深度纹理加载深度值,并将该值分配给片段着色器中的 gl_FragDepth
。但是,这将强制所有片段进行 late-zs 深度更新,与在 early-zs 处使用真实三角形 z-value 相比,这非常慢,因为您必须 运行 着色器在确定是否需要保留片段之前。因此,根据上述内容,我建议重新设计您的渲染管道,这样您就不需要这样做了...