即使不使用深度测试,我也会失去/获得丢弃像素的性能吗?


22

当我第一次搜索废弃指令时,我发现专家说使用废弃将导致性能下降。他们说,丢弃像素将破坏GPU正确使用zBuffer的能力,因为GPU必须首先为两个对象运行Fragment shader,以检查是否更靠近相机的对象被丢弃。对于我目前正在开发的2D游戏,我同时禁用了深度测试和深度写入功能。我正在绘制按深度排序的所有对象,仅此而已,无需GPU即可完成精美的工作。现在我想知道是否可以将片段着色器中的像素丢弃吗?

Answers:


20

图形硬件可以在计算片段的颜色值之前(换句话说,在运行片段着色器之前)执行基于深度的早期片段筛选。因此,如果您使用任何可能影响此功能的功能,例如discardAlpha测试或操纵gl_FragDepth硬件执行该功能的能力,那么都会受到损害,因为无法假定片段的真实深度并且必须运行完整的着色器。

但是,使用这些折中的功能中的任何一项是否会对性能产生净影响,这取决于情况。例如,如果您拥有非常昂贵的片段着色器,则Early-z优化可以提高性能,但是如果管道的成本在顶点着色器(或其他位置)中,则它不会给您带来太多好处,因此,您可能看不到或使用不会导致性能下降discard

完全通过API禁用深度测试也应阻止优化运行,因为它可能导致场景渲染错误。那么,就您而言,使用没关系discard

最近的硬件可以使用以下方法强制进行测试(包括早期的模板测试)layout(early_fragment_tests):在答案开头我链接的页面上有更多信息(和注意事项)。


3

与性能问题一样,最准确的答案是在目标硬件上进行尝试并衡量会发生什么。

对于您而言,这可能不是一件坏事。实际上,它有可能通过节省内存带宽来提高性能。不过,它还将添加着色器指令,因此并不总是具有性能优势。

即使在使用深度缓冲区时,如果您小心地按顺序绘制东西,性能影响也不总是很明显。

https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/上有一篇博客文章,其中详细介绍了早期深度测试的工作方式在硬件上,可能会有什么限制。


1
实际上,在测试之后,我认为可以安全地说我既不会丢失也不会获得性能,但是我一直在寻找一个答案,以给出深入解释什么以及为什么会发生的信息。
Ali1S232
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.