美文网首页
关于unity ZWrite和ZTest

关于unity ZWrite和ZTest

作者: 飞翔的蜗牛235 | 来源:发表于2023-08-23 15:04 被阅读0次

1: ZWrite 深度写入,zTest 深度测试

1.为什么需要深度呢?在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。(越后绘制的东西,距离相机就越近),深度缓存,深度测试 就是为了解决同一个像素点 有不同的颜色要显示的时候。最终要显示哪个颜色,丢弃哪些颜色,最终颜色缓冲区的显示的就是我们看到的

2:unity zWrite 和zTest的默认值

  1. unity的 Zwrite默认是 On 写入深度
  2. unity的 ZTest默认是 LEqual 深度小于等于当前缓存则通过,意味着深度只小的将显示在深度值大的前面(也可以理解为距离摄像机近的显示在前面)

3 :zWrite和ZTest的几种值

  1. zWrite:开启后,若通过ZTest,则会把自己的深度值写入到深度缓存区
    ZWrite On:写入深度
    ZWrite Off:不写入深度
  2. 开启后,它会与深度缓存区的深度值进行比较。通过比较则写入到颜色缓存区(这里会经历颜色混合Blend),不通过则丢弃
    ZTest Less:深度小于当前缓存则通过
    ZTest Greater:深度大于当前缓存则通过
    ZTest LEqual:深度小于等于当前缓存则通过
    ZTest GEqual:深度大于等于当前缓存则通过
    ZTest Equal:深度等于当前缓存则通过
    ZTest NotEqual:深度不等于当前缓存则通过
    ZTest Always:不论如何都通过
    下面是一张深度缓存和深度测试的一张流程图:


    000.png

4 :一些案例验证分析

  1. 我们可以在场景中生成两个Cube进行测试


    testA.png

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 被丢弃了在同像素点上

相关文章

网友评论

      本文标题:关于unity ZWrite和ZTest

      本文链接:https://www.haomeiwen.com/subject/admpmdtx.html