繁体   English   中英

考虑到深度,将FBO渲染到屏幕

[英]Render FBO to screen taking into account Depth

目标:OpenGL ES 3.0

假设我的默认帧缓冲区(屏幕)已经包含渲染的场景的一部分; 其颜色和深度缓冲区包含有效数据。

现在假设我已经将场景的另一部分渲染到了中间FBO'fbo1'。 它的颜色数据保存在纹理'mColor'中,该纹理附加到fbo1.COLOR0附件中,其深度保存在另一个纹理'mDepth'中,该纹理附加在另一个FBO'fbo2'的DEPTH附件中。

现在,我要考虑mDepth的深度,将mColor渲染到屏幕上。 我知道如何在屏幕上渲染仅包含颜色数据的纹理,但考虑到mDepth,我不知道如何进行渲染。

从本质上讲,当我们将具有mColor的Quad渲染到屏幕上时,我们需要将Screen的深度缓冲区与Quad的深度而不是Quad的深度进行比较。 怎么做?

您可以将FBO的深度用作纹理。 绘制FBO的内容时,您将绘制颜色传递并从FBO的深度纹理中手动编写gl_FragDepth。 之后,您可以启用适当的深度测试来绘制所有其他场景内容。

如果您要分割流水线并在与屏幕外渲染交错的多个通道中渲染FBO0,则简单的答案是“您做错了”。

您正在强迫GPU写入和回读中间状态,这是极其低效的,尤其是在具有基于图块的架构的移动设备上。

首先渲染每个屏幕外的通道,然后一次渲染窗口表面(FBO0)的轮廓。

我们需要将屏幕的深度缓冲区与四边形的深度而不是四边形的深度进行比较。 怎么做?

从深度纹理加载深度值,然后将该值分配给片段着色器中的gl_FragDepth 但是,这将迫使所有片段进行zs后期深度更新,这与在zs早期使用真实三角形z值相比要慢得多,因为在确定是否需要保留片段之前必须运行着色器或不。 因此,按照上述建议,我建议重新设计渲染管道,这样您就不需要这样做了……

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM