今天在写shader的时候发现这样一个问题:将一个不透明物体(该物体的queue为geometry或者background)的Zwrite设置为Off后,拖入一个空的场景,发现这个物体并不能够在场景中渲染出来。只有当queue的值为tranparent以上的时候(即render queue的值为3000以上)才可以在场景中出现。然后通过frame profile检测了一下渲染序列,并通过google查看了相关讨论,发现在unity5.x之后skybox的渲染顺序发生了变化。目前的渲染顺序为2500.5,在所有的opaque物体渲染完了以后才进行天空盒的渲染。
这时回到之前的问题,拖入场景的物体此时已经渲染完毕,并且因为zwrite off的缘故,在深度缓存中没有该物体的信息。之后进行skybox的渲染。skybox的渲染对于ztest是采用的默认设置,由于物体处的z值没有经过改变,还是最大值1,所以skybox的深度测试通过,将skybox的颜色写入颜色缓冲区内,也就是说把之前物体的渲染结果给覆盖掉了,从而产生了以上现象。
解决办法就是将该物体的zwrite off改为on,或者将render queue的值改为>2500。
总结一下渲染顺序就是:geometry--->skybox----->transparent/overlay。在geometry渲染的物体,不能将深度写入关闭,否则就会被skybox给遮挡住。