unity 渲染层级详解

时间:2024-03-15 19:51:00

1  Camera 
Camera是unity中最优先的渲染顺序控制。depth越大,渲染顺序越靠后。 

unity 渲染层级详解

2、Sorting Layer
在Tags & Layers设置中可见

unity 渲染层级详解

3、Order In Layer
相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效。
4、RenderQueue
Shader中对Tags设置的“Queue”。

当Sorting Layer和Order In Layer相同时
RenderQueue小的先进渲染管线。

当Sorting Layer和Order In Layer不相同时!
当两个材质使用了不同的RenderQueue,且这两个RenderQueue都在[0~2500]或[2501~5000]时,SortingLayer和OrderInLayer的排序生效。

当两个材质使用了不同的RenderQueue,且这两个RenderQueue分别在[0~2500]和[2501~5000]时,则一定会按照RenderQueue绘制,无视SortingLayer、OrderInLayer的排序


5、 MeshRenderer 和SpriteRenderer 都是继承于 Renderer 的组件 
它们的 sorting 和 orderinlayer 都是暴露出来的属性  可以在属性视图修改
模型蒙皮  skinned mesh render 虽然也继承了 Renderer 但在属性视图没有出现该属性    一般只能更改蒙皮的shader  RenderQueue  调整默认sorting layer 和 Orderinlayer下 和其他物体的层级
所以一般设置材质的renderQueue或直接在shader中设置。

在ShaderLab中,有4个提前定义好的render queue,你可以设置更多的在他们之间的值:
Background :表示渲染在任何物体之前 
Geometry(default):渲染大多数几何物体所用的render queue 
AlphaTest:用于alpha测试 
Transparent:用于渲染半透明物体 
Overlay:渲染所有物体之上


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如果混用 2DUI 和 模型  模型又穿插在两个 NGUI panle中间  不通过增加摄像机数量来解决的话应该怎么办:
默认情况下 游戏中只有一个默认的 sorting layer , 和一个默认的 OrderInLayer 。 所有物体都在一个 sorting layer 和
OrderInLayer 下面  ,
这时候设置渲染顺序的方式就是通过更改 RenderQueue ,较小的先渲染  ,   Ngui panle 会默认根据drawcall 优化操作 设置当前panle下的ui RenderQueue (一般是3000起)。

 

unity 渲染层级详解

Automatic:由NGUI自动生成 
StartAt:手动设置一个值 
Explicit:同一个panel下的RenderQueue的值相同

看代码可以理解一下,UIPanel.cs 

unity 渲染层级详解

而使用 skinned mesh render , 则是更改使用材质处shader 的 skinned mesh render ,  设置值在两个panle  RenderQueue 之间就行了。

如果是使用龙骨和spine 动画还有粒子系统的话, 层级控制就只能在默认 sorting layer 下更改 龙骨、 spine、粒子系统的 orderinlayer ,    再打开 ngui panle 上的 oder in layer 选项,   通过设置3者之间的oder in layer值调整顺序就好了 。

再加上 使用skinned mesh render 蒙皮的模型的话,在开启ngui panle的 oder in layer 后,  由于模型默认在最低的 order in layer 下,此时 ,再怎么调整模型的 shader RenderQueue 模型都不会渲染到最上面,解决办法是:
通过脚本获取 模型 skinned mesh render 的  oderinlayer 参数,  并修改它的值穿插在各层之间 

unity 渲染层级详解

unity 渲染层级详解

(1 性能上可能增加drawCall 还未具体测试过 , 模型是不是这样修改渲染层级我也不知道 ,没怎么用过 ,这只是我自己的解决方案。 2 还于到一个情况  ,如果Ngui的panle  打开了Oder in layer 选项而又 设值为0 的情况下  ,该panle下的对象 可能渲染到最上层,原因可能要看代码了)。