关于Early-Z Culling(提前Z拣选)
作者:cywater2000
日期: 2008-12-7
来自:http://blog.csdn.net/cywater2000
其实以前在写流体模拟程序的时候用过Early-Z Culling(提前Z拣选,以下简称EZC),但当时把它和传统的Z-Test搞混淆了。
我们知道,Z-Buffer在图形学中的作用是剔除遮挡面。好了,那我问你,Z-Test具体发生在流水线的哪个阶段?肯定是Frame Buffer更新之前对吧?那么,是pixel shader(以下简称PS)之前还是之后呢?嘿嘿~
传统Z-Test其实是发生在PS之后的,因此仅仅依靠Z-Test并不能加快多少渲染速度。而EZC则发生在光栅化之后,调用PS之前。EZC会提前对深度进行比较,如果测试通过(Z-Func),则执行PS,否则跳过此片段/像素(fragment/pixel)。不过要注意的是,在PS中不能修改深度值,否则EZC会被禁用。
这样,在整个流水线阶段,深度比较发生了2次,一次是EZC,一次是传统Z-Test。
除了利用EZC帮助传统Z-Test加速之外(硬件自动调用,我称其为隐式用法),目前还有2个显示引申用法:一个类似于Deferred Shading(延迟着色)。比如说渲染头发的时候,有很多不透明的部分会挡住透明的部分,为了避免计算被挡住的透明部分(alpha混合很费)就可以使用EZC;另外一个典型应用是GPGPU中迭代法求解线性方程组,当某些矩阵单元的值已经满足要求时(比如收敛),则可以跳过计算。
显示引申使用EZC的典型框架如下:
Pass1: 准备z-buffer。
通常有两种作法:一种是直接“简单”渲染模型(不写frame buffer,只写z buffer);一种是人为指定depth/z值(即作为阈值,例如迭代法求解线性方程组)。
Pass2: 正常渲染。(禁用Z-Write)