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