1

我有一个主要场景,并且我有一个想要在其之上渲染的场景。我想使用早期深度测试来提高性能,所以我想把所有东西从前到后一起渲染。但是我不能将每个场景隔离到深度缓冲区的一半,因为这会限制它的精度。我可以渲染后面的场景,清除深度缓冲区,然后渲染前面的场景,这样可以正确绘制,但会导致不必要的过度绘制。额外的帧缓冲区加上 blit 同样会导致过度绘制。

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

4

1 回答 1

1

我有一个主要场景,并且我有一个想要在其之上渲染的场景。我想使用早期深度测试来提高性能,所以我想把所有东西从前到后一起渲染。但是我不能将每个场景隔离到深度缓冲区的一半,因为这会限制它的精度。

通常,您有 24 位的深度缓冲区精度。将其分成两半产生...... 23位精度。不知何故,我相当怀疑这将是一个主要问题。如果是这样,您总是可以通过减少正面覆盖的空间来收回这一点。比如说,只有 5% 的深度范围。

这就是 FPS 游戏如何进行“视图模型”(玩家的手和枪)叠加。做专业人士做的事。

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

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

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

但是这个练习的重点是表现,是吗?考虑必须发生什么才能使我刚才所说的起作用。

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

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

于 2012-11-09T23:55:16.910 回答