OpenGL有效地渲染多个图层

时间:2012-11-09 17:05:45

标签: opengl render layered

我有一个主场景,我有一个场景,我想在它上面渲染。我想对性能进行早期深度测试,所以我想从前到后一起渲染所有内容。但我无法将每个场景隔离到深度缓冲区的一半,因为这会限制其精度。我可以渲染后景,清除深度缓冲区,并渲染前场景,这将正确绘制,但会产生不必要的透支。额外的帧缓冲加上blit同样会导致过度绘制。

理想的解决方案(如下所述)是使用glDepthRange在深度缓冲区内建立多个区域,允许正常渲染以两次从前到后的顺序进行,以最大限度地减少过度绘制,同时防止跨层遮挡。 / p>

1 个答案:

答案 0 :(得分:1)

  

我有一个主场景,我有一个场景,我想在它上面渲染。我想对性能进行早期深度测试,所以我想从前到后一起渲染所有内容。但是我无法将每个场景隔离到深度缓冲区的一半,因为这会限制其精度。

通常,您有24位深度缓冲精度。将此分成两半会产生...... 23位的精度。不知何故,我更怀疑这将成为一个主要问题。如果是这样,您可以通过减少前面叠加层的空间来回收它。比方说,只有5%的深度范围。

这就是FPS游戏的“视图模式”(玩家的手和枪)覆盖的方式。做专业人士所做的事。

  

我可以以某种方式渲染重叠场景,将深度缓冲区中的任何值更改为-1而不是1,然后渲染主场景吗?

-1不是有效的深度缓冲区值。所以我会假装你说的是0。

是的,你可以这样做。您可以将场景渲染为深度纹理。然后渲染一个全屏四边形,它从纹理中获取深度值,将其与1进行比较,如果它不是1.0,则写入0而不是1.0。

但这个练习的重点是表现,是吗?考虑一下我刚才所说的工作会发生什么。

在第一个场景完成渲染之前,GPU无法渲染全屏四边形。这意味着整个渲染管道必须完全冲洗,浪费宝贵的时间。

glDepthRange解决方案相比,这可能会更慢。