NO Batch ?
游戏场景中存在大量例子的时候,DrallCall的压力很大,但是遍历一遍之后发现,为啥一样的粒子特效竟然没有合并,why?经过很多测试后发现,如果把透明材质的修改为非半透明的,就可以合并,这就让我很奇怪了?Unity提供了材质动态合并的功能,虽然限制很多,但是对于透明材质的合并,Unity似乎给了一个很玄乎的答案:
Semitransparent shaders most often require objects to be rendered in back-to-front order for transparency to work. Unity first orders objects in this order, and then tries to batch them - but because the order must be strictly satisfied, this often means less batching can be achieved than with opaque objects.
这尼玛等于没说。。。。但是原因其实很明显:透明材质
透明材质
测试的时候发现:
1 带有透明材质的粒子如果把深度完全分开,那么相同材质的基于可以进行合并
2 把不同透明材质的渲染次序完全分开也可以进行合并
透明材质使用alpha blend的方式按摄像机距离从后向前进行渲染,如果对深度相同、渲染顺序相同的粒子进行渲染,Unity可能就完全按照乱序的方式进行渲染。但是修改深度或者渲染次序后,同样材质的粒子可能就会在相邻的次序进行渲染。 也就是说使用相同材质的物体需要在相邻的渲染队列中才会进行合并。那这样思路就很清晰,只需要对粒子的渲染次序或者深度进行适当的排序即可。
渲染次序
粒子一般是放在一起,修改深度可能不太现实,美术的妹子也不乐意,那OK ,只能修改渲染次序,存在两种情况:
(1)不同shader的材质,可以直接在shader中RenderQueue中定义,RenderQueue具体可以查看Unity官方定义:http://docs.unity3d.com/Manual/SL-SubShaderTags.html。一般来说透明材质是从3000开始,渲染的时候这个数值从小向大渲染(之前美术做的渲染次序全部在3000)。
(2) 相同shader不同贴图:这个我也没辙,只能通过Unity 属性面板中debug模式进行修改
经过场面的处理后,不同的材质使用不用的渲染次序,粒子的drallcall 就可以完全进行合并。
一些思考
(1)场景中渲染次序问题
其实Unity已经把场景中的物体区分为不同类型,如下图,但是在使用中还是需要注意很多。最好是在项目初期就会好好场景中可能用到的渲染次序分类。
(2)透明度交叉渲染(OIT)
粒子比较小,所以可能不存在交叉渲染的问题,但是对于透明物体而言,alpha blend模式下需要从后向前渲染,如果存在透明物体交叉的情况就很麻烦。如下图:
具体详情可以参考这篇文章
http://blog.csdn.net/candycat1992/article/details/41599167
对于和排序无关的透明渲染可以参考:
https://developer.nvidia.com/content/transparency-or-translucency-rendering
http://www.cnblogs.com/wubugui/p/5099418.html