Early-Z and Pre-Z -- 介绍与区别
Depth Testing 深度测试
在介绍Early-Z和Pre-Z之前,我们首先得了解深度测试.
深度测试是用于解决物体可见性问题(是否被遮挡)的技术.在渲染管线中位于片元着色器之后
但是深度测试会带来一个问题:
即有的片元在经历了着色后,在深度测试环节被直接抛弃了,这显然是对算力的浪费–我们完全可以不用计算这些片元.
我们把这一问题称为OverDraw问题.
Early-Z就是这个问题的一种解决方案.
Early-Z
Early-Z是在光栅化之后,片元着色器之前增加的一步操作
在这一流程中,会进行一次深度测试,剔除掉所有不通过的片元,这样就减少了算力 的浪费.
读者可能会想,如果提前进行了深度测试,那最后不就不需要再进行深度测试了吗?
事实上,由于渲染管线的复杂性,我们需要再最后再次进行深度测试(用于区分可以叫做z-check)以支持透明物体,抗锯齿等等操作.
Pre-Z
Early-Z也存在一些问题:
- 物体由远及近渲染时,Early-Z效率较低.为提高效率需要CPU排序
- 不支持透明物体
Pre-Z可以解决这些问题.
方法是,使用两个pass渲染:第一个pass不输出任何颜色,只写入深度值;第二个pass关闭深度写入,进行正常着色,将深度比较函数设置为相等.
这样,第一个pass的结果形成了一个z-buffer,就不再需要CPU排序了.
但问题也十分明显:
- 两个pass增加了Draw Call
- 多pass shader 合批麻烦
事实上,Pre-Z只有在OverDraw问题严重时才有用,否则可能得不偿失(开销大于优化).
在实际使用中,可以通过一些手段来利用上Unity 的SRP Batch功能来优化一定的性能.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 VanishingBlog!