前对于ZTest ZWrite Blend的概念不是很清楚,只是知道开启Blend的时候,ZWrite要关闭,但不清楚为什么,今天用实验梳理了一下流程,做下笔记。如有错误,感谢指出。上图
要注意的是ZTest 如果是Off状态的时候相当于 ZTest Always,即默认通过ZTest。
通过这个流程可以发现,ZTest在管线中的作用是决定深度缓冲与颜色缓冲的更新与否以及如何更新,与实际物体的渲染顺并没有关系。所以即便Z较小的物体,也可能绘制在Z较大的物体后面,而这是由物体所在的RenderQueue决定的。
RenderQueue的索引越小,越优先绘制,也就是会优先走上面的流程,对深度缓冲和颜色缓冲有优先的访问权(当然有放弃的权利ZWrite=Off)。
所以当判断物体之间遮挡以及透明混合的时候,按照物体之间RenderQueue的顺序,依次走上面的流程,判断深度缓冲和颜色缓冲的变化情况,即可推断出实际效果。
在实验时使用的unity版本为5.3.2,发现有一个bug:每当修改了shader中的Queue或者ZWrite状态的时候,回到unity,发现物体的渲染顺序并没有发生变化,需要手动切换一下材质上的shader文件,再切换回来才能看到改变后的结果,这个bug困扰了我半天,不知道后续版本有木有修复,替大家填个坑吧。