Unity渲染顺序

时间:2024-04-08 17:21:42

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


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

1.Camera Depth

Unity渲染顺序
两个Camera进行渲染时,Depth值越大,那么渲染的物体就会在更上面。


2. Z值

同一个camera下,如果两个物体的shader的深度写入(ZWrite On)和深度比较(ZTest)都是开启的,那么距离camera更近的将会渲染在更上面。


3.RenderQueue

同一个camera下,RenderQueue决定了渲染物体的顺序,RenderQueue值小的先渲染,RenderQueue大的后渲染。


4.SortingOrder

Unity渲染顺序

Unity渲染顺序

如图,这两个地方都可以设置SortingOrder. 一个是针对场景里面的物体,一个是针对UI。

规则:

1.SortingOrder大的一定渲染在更上面(不过有例外,看后面结论)

2.当SortingOrder一样的时候,那么RenderQueue小的先渲染,大的后渲染,于是RenderQueue大的渲染在上面


三.实例

(1)

Cube使用默认材质,是写入深度的,queue是2000,

Image使用的材质,是不写入深度, queue是3000

可以看到Cube部分深度值比Image小的,渲染在了前面

Unity渲染顺序


(2)

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

Image不写入深度,queue是3000

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

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

Unity渲染顺序


(3)

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

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

Image在前,Cube在后

Unity渲染顺序


(4)

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

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

Image在后,Cube在前

Unity渲染顺序


(5)

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

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

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

Unity渲染顺序


(6)

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

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

Unity渲染顺序

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


(7)

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

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

Unity渲染顺序

此时发现与(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在前面。