Unity渲染顺序

参考:http://blog.csdn.net/u011748727/article/details/68947207


一.影响渲染顺序的因素有:

1.Camera Depth

Unity渲染顺序_第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小的,渲染在了前面

Unity渲染顺序_第2张图片


(2)

ui渲染时不写入深度的,因为要支持alpha混合。

Image不写入深度,queue是3000

Image(1)不写入深度,queue是3000

此时Unity会进行排序,让Image(1)比Image更晚渲染,所以Image(1)在更上面

Unity渲染顺序_第3张图片


(3)

Cube不写入深度, queue2000, SortingOrder为0

Image 不写入深度,queue3000, SortingOrder为0

Image在前,Cube在后

Unity渲染顺序_第4张图片


(4)

Cube不写入深度, queue4000,SortingOrder为0

Image 不写入深度,queue3000, SortingOrder为0

Image在后,Cube在前

Unity渲染顺序_第5张图片


(5)

Cube关闭深度写入,queue是4000,SortingOrder为0

Image关闭深度写入,queue是3000,SortingOrder为1

结论:可以看到此时谁在前谁在后,不是由queue来决定了,而是还有根据SortingOrder的大小。

Unity渲染顺序_第6张图片


(6)

Cube关闭深度写入,queue是4000,SortingOrder为0

Cube(1) 关闭深度写入,queue是2501,SortingOrder为1

Unity渲染顺序_第7张图片

结论:跟(5)类似,前后顺序由 SortingOrder 和 RenderQueue共同决定


(7)

Cube关闭深度写入,queue是4000,SortingOrder为0

Cube(1) 关闭深度写入,queue是2500,SortingOrder为1

Unity渲染顺序_第8张图片

此时发现与(6)不同只是我们将Cube(1)的queue改为了2500,此时发现SortingOrder没有作用了。

所以推出以下结论:

当Sorting Layer和Order In Layer不相同时!
(1)当两个材质使用了不同的RenderQueue,且这两个RenderQueue都在 [0~2500] [2501~5000] 时,SortingOrder的排序生效。
(2)当两个材质使用了不同的RenderQueue,且这两个RenderQueue分别在 [0~2500] [2501~5000] 时,则一定会按照RenderQueue绘制,无视SortingOrder的排序。
推测是因为2500为Unity作为Opacity和Transparent的分界线,因此如果两个材质的Queue分别在分界线的两边,也就是一个不透明一个透明,则Unity一定会先把不透明的物体送进渲染管线,无论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在前面。





你可能感兴趣的:(Unity)