Answers:
图形硬件可以在计算片段的颜色值之前(换句话说,在运行片段着色器之前)执行基于深度的早期片段筛选。因此,如果您使用任何可能影响此功能的功能,例如discard
Alpha测试或操纵gl_FragDepth
硬件执行该功能的能力,那么都会受到损害,因为无法假定片段的真实深度并且必须运行完整的着色器。
但是,使用这些折中的功能中的任何一项是否会对性能产生净影响,这取决于情况。例如,如果您拥有非常昂贵的片段着色器,则Early-z优化可以提高性能,但是如果管道的成本在顶点着色器(或其他位置)中,则它不会给您带来太多好处,因此,您可能看不到或使用不会导致性能下降discard
。
完全通过API禁用深度测试也应阻止优化运行,因为它可能导致场景渲染错误。那么,就您而言,使用没关系discard
。
最近的硬件可以使用以下方法强制进行测试(包括早期的模板测试)layout(early_fragment_tests)
:在答案开头我链接的页面上有更多信息(和注意事项)。
与性能问题一样,最准确的答案是在目标硬件上进行尝试并衡量会发生什么。
对于您而言,这可能不是一件坏事。实际上,它有可能通过节省内存带宽来提高性能。不过,它还将添加着色器指令,因此并不总是具有性能优势。
即使在使用深度缓冲区时,如果您小心地按顺序绘制东西,性能影响也不总是很明显。
https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/上有一篇博客文章,其中详细介绍了早期深度测试的工作方式在硬件上,可能会有什么限制。