这个是nvidia‘s GPU Programming Guide,3.6节 中的内容。
就是在geforce fx,以及6以上的系列里面,加了early z optimization或者也叫zcull的特性。
正常的depth test是在pixel shader之后的pixel rendering阶段,即便一个fragment被砍掉,仍旧耗费了pixel shader的计算时间。
这个zcull是放在光栅化之后和pixel shader之前的位置,如果这个fragment没有通过zcull 的test,那么就被砍掉,不进入pixel shader进行计算。
zcull的硬件实现一般也是有一个memory与传统的depth/stencil memory绑定,当一个fragment从pixel shader中出来并且通过了depth/stencil test,这个fragment就会进一步做一个zcull的test,如果通过了就更新zcull memory。这个更新memory的test和pixel shader之前的那个test不是一个含义的。
而这个zcull memory也就是用来在pixel shader之前砍fragment的依据。
如果是我们通过SetRenderTarget换了depth/stencil memory,就是用了没有被zcull 绑定的depth buffer,zcull就不起作用而且也不会更新。
---------------------------------------------------------------------------------------------------------------------------------------------------
使用zcull时候最好先构建一个depth buffer。
这里就用到double-speed-depth/stencil-render
在禁掉color buffer写入,alpha test, user clip,multi-sampling,texkill, color key的情况下,render会变得非常快。
由于实际操作的时候,做double speed z only render都省去lighting, texture sampling等等,这个速度非常快。
然后用这个结果来做zcull,可以省去大量的计算。
另外说一点,这个double-speed-z-only-render用来清depth buffer非常好,某些情况下比硬件提供的clear_depth_buffer函数还快。
---------------------------------------------------------------------------------------------------------------------------------------------------
这种剔除优化已经比较生猛了,可以大幅度弥补cpu端对可见性判断优化不足的特点,节省大量计算。
cool feature
原文地址:http://blog.csdn.net/ccanan/archive/2007/06/17/1655470.aspx