Unity ZTest深度测试 & ZWrite深度写入

Shader深度渲染队列Queue预定义值:Background(1000)、Geometry(2000)、AlphaTest(2450)、Transparent(3000)、Overlay(4000)。

渲染优先顺序: Queue值越小越先渲染,后渲染的物体会覆盖先渲染的物体。

 

测试:我想让远处的红色方块遮挡住近处的蓝色方块,即让蓝色的先渲染,红色的后渲染,我将红块的Queue设置为Transparent ,蓝块的Queue值设置为Transparent -1,按照上面的渲染优先顺序,值越小越先渲染,按道理红块后渲染应该覆盖在蓝块前面对吧,结果却不是这样的,蓝块依旧在红块前面。

这是为什么呢?原因在下面两条指令,shader代码中虽然没有定义,但是默认存在的。

ZTest:深度测试。(LEqua小于等于、Less小于、Greater大于、Equal等于 , NotEqual不等于)

ZWrite:深度写入。(On打开、Off关闭)。

 系统中存在一个颜色缓冲区和一个深度缓冲区,分别存储颜色值和深度值,来决定画面上应该显示什么颜色。深度值是物体在世界空间中距离摄像机的远近,距离越近深度值越小,反之越大。

上面的测试中,蓝色方块比红色方块近,那么蓝色方块的深度值就比红色方块小。假设蓝块的深度值为1,红块深度值为2,例子中蓝块优先渲染,系统就先将蓝色值存入颜色缓冲区,将深度值1存入了深度缓冲区。

接下来渲染红块,系统会将红块的深度值和缓冲区的深度值对比(这个过程就是深度测试),由于ZTest的深度测试方式是Lequal小于等于,即深度值小于1才会通过测试,如果通过了测试,且ZWrite处于On状态,

该颜色的深度值就会替换深度缓冲区中的值,颜色值也会替换颜色缓冲区中的值,从而显示新的颜色。很显然,2 > 1,深度测试并不能通过,红色也就不能显示在蓝色的前面。

 

如果我们硬要远处的红块遮挡近处的蓝块,很显然,我们应该关闭深度写入ZWrite或者关闭深入测试ZTest,能得到我们想要的结果,如下:

 

posted @ 2018-10-24 20:55  Mr. Ant  阅读(6136)  评论(1编辑  收藏  举报