[转]Early Z Culling 优化

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优化,因此一旦在硬件不支持这个特性的显卡上使用此技术,反而会导致效率下降。


from : http://luliyi1024.googlepages.com/earlyzopt


from cywater:

传统Z-Test其实是发生在PS之后的,因此仅仅依靠Z-Test并不能加快多少渲染速度。而EZC则发生在光栅化之后,调用PS之前。EZC会提前对深度进行比较,如果测试通过(Z-Func),则执行PS,否则跳过此片段/像素(fragment/pixel)。不过要注意的是,在PS中不能修改深度值,否则EZC会被禁用。

这样,在整个流水线阶段,深度比较发生了2次,一次是EZC,一次是传统Z-Test(注: 区别可能在于EZC无法写入深度)。

除了利用EZC帮助传统Z-Test加速之外(硬件自动调用,我称其为隐式用法),目前还有2个显示引申用法:一个类似于Deferred Shading(延迟着色)。比如说渲染头发的时候,有很多不透明的部分会挡住透明的部分,为了避免计算被挡住的透明部分(alpha混合很费)就可以使用EZC;另外一个典型应用是GPGPU中迭代法求解线性方程组,当某些矩阵单元的值已经满足要求时(比如收敛),则可以跳过计算。

显示引申使用EZC的典型框架如下:

Pass1: 准备z-buffer。(注:比普通渲染多一次pre Z pass,当然如果采用Defered Shading,那就不存在了

通常有两种作法:一种是直接“简单”渲染模型(不写frame buffer,只写z buffer);一种是人为指定depth/z值(即作为阈值,例如迭代法求解线性方程组)。

    Pass2: 正常渲染。(禁用Z-Write)

 

相关资料:

Applications of Explicit Early-Z Culling
Explicit Early-Z Culling and Dynamic Flow Control on Graphics Hardware

以及GPU Gems2的第30章

 

From OpenGPU 论坛:

      实际上在传统管线中,z test 不可能用来剔除 pixel shader 片断的执行。但是,在当前的一些显卡中(注:Geforce 6系列已支持),很多都把 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优化,因此一旦在硬件不支持这个特性的显卡上使用此技术,反而会导致效率下降。


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值