1: ZWrite 深度写入,zTest 深度测试
1.为什么需要深度呢?在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。(越后绘制的东西,距离相机就越近),深度缓存,深度测试 就是为了解决同一个像素点 有不同的颜色要显示的时候。最终要显示哪个颜色,丢弃哪些颜色,最终颜色缓冲区的显示的就是我们看到的
2:unity zWrite 和zTest的默认值
- unity的 Zwrite默认是 On 写入深度
- unity的 ZTest默认是 LEqual 深度小于等于当前缓存则通过,意味着深度只小的将显示在深度值大的前面(也可以理解为距离摄像机近的显示在前面)
3 :zWrite和ZTest的几种值
- zWrite:开启后,若通过ZTest,则会把自己的深度值写入到深度缓存区
ZWrite On:写入深度
ZWrite Off:不写入深度 -
开启后,它会与深度缓存区的深度值进行比较。通过比较则写入到颜色缓存区(这里会经历颜色混合Blend),不通过则丢弃
ZTest Less:深度小于当前缓存则通过
ZTest Greater:深度大于当前缓存则通过
ZTest LEqual:深度小于等于当前缓存则通过
ZTest GEqual:深度大于等于当前缓存则通过
ZTest Equal:深度等于当前缓存则通过
ZTest NotEqual:深度不等于当前缓存则通过
ZTest Always:不论如何都通过
下面是一张深度缓存和深度测试的一张流程图:
4 :一些案例验证分析
-
我们可以在场景中生成两个Cube进行测试
1:A-Cube
Tags{ "Queue" = "Geometry + 200" }
ZWrite On
ZTest LEqual
那么A方块的深度就会被写到深度缓存中
2:B-Cube
Tags{ "Queue" = "Geometry+300" }
ZWrite Off
ZTest Off 等于 ZTest Always:不论如何都通过
结果:B在前面
分析:A将像素写进了深度缓存中;B没有成功将像素写进了深度缓存中,但因为ZTest Off(直接通过),B将颜色缓存中的蓝的像素颜色值替换了。
也就是深度缓存中是A像素的深度,颜色缓冲中是白像素的颜色
如果把B-Cube改为下面的情况
Tags{ "Queue" = "Geometry+300" }
ZWrite On
ZTest LEqual
结果: A在前面 A将像素写进了深度缓存,B的深度值大,由于LEqual B的深度测试没有通过,所以显示A, 深度缓冲区的深度还是A,颜色缓冲区也是A
等于B 被丢弃了在同像素点上