现代GPU的Early-Z:性能关键与失效陷阱

现代GPU硬件普遍自带Early-Z技术,能够提前丢弃被遮挡像素以提高渲染效率。然而,当片元着色器使用discard/alpha test时,Early-Z会失效,因为像素可见性只能在着色器执行后确定。这导致所有像素都必须先执行着色器,再测试深度,显著降低渲染性能。因此,在TBDR架构下应避免在主渲染流程中使用discard/alpha test,以充分发挥Early-Z的优化效果。


1. HSR和Early-Z的关系

HSR(Hidden Surface Removal):指的是在渲染过程中,自动丢弃被遮挡的像素,避免无谓的计算和写入。

Early-Z:是HSR的一种实现方式,即在片元着色器(Fragment Shader)执行前,先做深度测试,能提前丢弃被遮挡的像素。


2. 硬件自带Early-Z的意义

现代GPU(包括移动端和桌面端)都自带Early-Z/Hi-Z,这是提升渲染效率的关键。

Early-Z能极大减少片元着色器的执行次数,节省带宽和能耗。


3. 为什么有Early-Z还会被discard/alpha test影响?

Early-Z的前提是:像素是否可见在着色器执行前就能确定。

discard/alpha test属于着色器内部的分支,只有执行到那一行代码时,才知道像素是否被丢弃。

所以一旦shader里有discard/clip/alpha test,Early-Z通常会被自动关闭,转为Late-Z(着色后再做深度测试),这样所有像素都要先执行一遍着色器,Early-Z的优势就没法发挥出来。


4. 例子

没有discard/alpha test的shader:

① Early-Z先测试深度,遮挡的像素直接丢弃,不执行shader。

② 只有可见像素才执行shader,效率高。

有discard/alpha test的shader:

① 必须先执行shader,等shader里判断是否discard。

② 只有shader执行完,才能决定是否写入,Early-Z失效。


5. 结论

HSR硬件自带Early-Z,但只要shader里有discard/alpha test,Early-Z就会失效,必须等shader执行完才能决定像素命运,效率大幅下降。

这就是为什么在TBDR(如PowerVR、Mali)等架构下,强烈建议避免在主渲染流程中使用discard/alpha test。


版权声明:本文为CSDN博主「你一身傲骨怎能输」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33060405/article/details/149212077

最新文章