参考:http://blog.csdn.net/u011748727/article/details/68947207
一.影响渲染顺序的因素有:
1.Camera Depth
2. Z值
同一个camera下,如果两个物体的shader的深度写入(ZWrite On)和深度比较(ZTest)都是开启的,那么距离camera更近的将会渲染在更上面。
3.RenderQueue
同一个camera下,RenderQueue决定了渲染物体的顺序,RenderQueue值小的先渲染,RenderQueue大的后渲染。
4.SortingOrder
如图,这两个地方都可以设置SortingOrder. 一个是针对场景里面的物体,一个是针对UI。
规则:
1.SortingOrder大的一定渲染在更上面(不过有例外,看后面结论)
2.当SortingOrder一样的时候,那么RenderQueue小的先渲染,大的后渲染,于是RenderQueue大的渲染在上面
三.实例
(1)
Cube使用默认材质,是写入深度的,queue是2000,
Image使用的材质,是不写入深度, queue是3000
可以看到Cube部分深度值比Image小的,渲染在了前面
(2)
ui渲染时不写入深度的,因为要支持alpha混合。
Image不写入深度,queue是3000
Image(1)不写入深度,queue是3000
此时Unity会进行排序,让Image(1)比Image更晚渲染,所以Image(1)在更上面
(3)
Cube不写入深度, queue2000, SortingOrder为0
Image 不写入深度,queue3000, SortingOrder为0
Image在前,Cube在后
(4)
Cube不写入深度, queue4000,SortingOrder为0
Image 不写入深度,queue3000, SortingOrder为0
Image在后,Cube在前(5)
Cube关闭深度写入,queue是4000,SortingOrder为0
Image关闭深度写入,queue是3000,SortingOrder为1
结论:可以看到此时谁在前谁在后,不是由queue来决定了,而是还有根据SortingOrder的大小。
(6)
Cube关闭深度写入,queue是4000,SortingOrder为0
Cube(1) 关闭深度写入,queue是2501,SortingOrder为1
结论:跟(5)类似,前后顺序由 SortingOrder 和 RenderQueue共同决定
(7)
Cube关闭深度写入,queue是4000,SortingOrder为0
Cube(1) 关闭深度写入,queue是2500,SortingOrder为1
此时发现与(6)不同只是我们将Cube(1)的queue改为了2500,此时发现SortingOrder没有作用了。
所以推出以下结论:
最终结论:
1.当都写入深度的时候,谁距离摄像机近,谁在前。
2.当都不写入深度的时候
(1)SortingOrder一样
RenderQueue更大的在前面
(2)SortingOrder不一样时
(a)两个都RenderQueue大于等于2051 或者 RenderQueue都小于等于2500时,那么谁的SortingOrder大,谁在前面
(b)当一个RenderQueue在0~2500 ,一个在2501之后,那么此时SortingOrder失效,谁的RenderQueue更大,谁在前面
3.当一个写入深度,一个不写入深度时
(1)A写入深度,RenderQueue为2000 ; B不写入深度,RenderQueue为3000
(1)A先渲染,并且写入深度Z。B后渲染,然后比较Z,如果B的Z值更小,那么ZTest成功,B写入颜色缓冲区,B在前面.
(2)A先渲染,并且写入深度Z。B后渲染,然后比较Z,如果B的Z值更大,那么ZTest失败,B不写入颜色缓冲区,B相当于被丢弃了。
(2)A写入深度,RenderQueue为3000 ; B不写入深度,RenderQueue为2000
(1)B先渲染,写入颜色缓冲区。A后渲染,此时深度缓冲无值,那么A的ZTest成功,写入颜色缓冲区, A在前面。