Early Z Culling 优化

网易杭州 卢立祎

传统的3D硬件渲染管线中,Z test 所处的位置如下:

…………
multitex | PixelShader?
fog effects
alpha test
stencil\depth test *
alpha blending
dither
…………

可以看到,实际上在传统管线中,z test 不可能用来剔除 pixel shader 片断的执行。

但是,在当前的一些显卡中,很多都把 z test 提前到了pixel shader 之前执行一次,被称
为 Early -Z Culling 优化。
但是从管线次序中可以清楚地看到,alpha test 成为了 z test 的限制,因为一旦打开了
alpha test, 对于在 alpha test 中失败的像素 Early-Z 将不能正确地被判断。因此对于部
分显卡硬件,一旦关闭了 alpha test,Early-Z Culling就会被自动打开。
为了充分体现出 Early-Z Culling 的威力,一般来应该在 prezwriting 的 pass 阶段就应
该先执行一次 alpha test,并且关闭对 color target 的填充,在 pixel shader 中只把
alpha值返回出去供 alpha test 使用。

但是问题随之出现: 对于一块未知的3D适配器,无法通过caps得知其是否支持 early-z
culling优化,因此一旦在硬件不支持这个特性的显卡上使用此技术,反而会导致效率下降。