三个测试都用于判断像素是否需要丢弃,但执行顺序却会极大影响效率,按一般顺序,像素经过PixelShader通过光照等计算后,得到颜色值,之后会进入这三个test。首先进行alpha test,不符合条件的(一般是透明度小于参考值)像素值丢弃,然后进入stenci test,不能通过测试的像素丢弃,最后进入z test,同样是丢弃不能通过测试的像素(一般是深度值较大的被遮挡像素)。如果仔细推敲便可发现,如果像素值是被stencil或z test丢弃掉了,那么pixel shader中的光照等计算就是做无用功,所以一个被遮挡的像素直接丢弃就好了,那么一开始就应该做stencil和z test。但这里忽略了个问题,深度值由光栅化得到,但pixel shader可以修改深度值或丢弃像素的,所以,默认深度是被遮挡的,经过pixel shader修改后可能就没有被遮挡了,同样如果一开始做了z test而pixel shader中或alpha test中又把像素丢弃了,那么z test中的深度值就不该写入。基于上面的过程,硬件设备厂商拿出了各自的优化方法,在一些条件下将z test放到pixelshader之前做,比如没有alpha test、关闭z write、pixel shader没有修改深度、pixelshader没有调用clip等函数丢弃像素等,这种做法称为 early z,stecil也类似。
shader中的z、stencil、alpha测试
最新推荐文章于 2024-04-25 16:20:30 发布