在
unity5中減小Draw Calls(SetPass Calls)
我一直工做
於
unity5支持的Standard Shader(標準着色器)上
,
而且作了一些關於如何有效地減小draw call
的
測試
,
在Unity5全新的standard shader上
,
實際成果至關可觀。
咱們先科普一下standard shader。Standard Shader是個基於物理的着色器, 物理渲染和當今的主流光照計算最大的區別就是,當今的lambert blinn phone基本上是基於模擬的模型,就是儘量的去模擬咱們看上去的物體反射的顏色,甚至能夠說是拍腦殼的模型,用於欺騙咱們的眼睛,而基於物理的光照計算則是依據了光線傳播的物理特性,更加貼近於真是的光照狀況,雖然在實現上仍是用了一些近似計算。因此物理渲染在表現天然界的物體時尤爲的看上去更加真實。
這是個小視頻介紹了下standard shader能夠實現的效果,
官方的U5Shader視頻
這個standard shader「變化」是變得更快仍是更慢,取決於貼圖你使用的
texture slots
。儘管如此,這兩種着色器是不一樣的(即便他們使用的都是standard shader):
<ignore_js_op>
html
這兩個shader(即便他們是」Standard shader」)
當渲染場景時他們是徹底不一樣的shader,所以若是咱們想減小一些draw call(setpass call),必須採用徹底不一樣的處理方式。
在談到如何在Unity5減小draw call以前,我將探討不管shader是否被使用時怎樣減小draw calls,而後討論在Unity5中使用Standard shader減小draw calls.
若是咱們想減小draw call,在Unity中或者在其餘引擎上,能夠儘可能減小使用的material(材質)。
基本上,這些能夠還原爲這些簡單的步驟:
1.整理全部的material而且經過他們的shader類型收集他們
2.
第二步:對於使用相同shader的材質,將他們的貼圖作成一個圖集(Atlas)
3.
建立一個material,它將包含shader和
圖集(Atlas)
4.
網格的全部UV從新映射,使用Shader適配圖集的座標
5.用映射的網格建立出步驟3的material
第一步:整理全部的material,並收集它們的shader類型
我打算用一個簡單的場景解釋,這個場景全部網格使用的是相同類型但不一樣texture的material.
在咱們的狀況下,咱們將使用這個場景(其中包含4個material,其中每個都具備
Bumped Diffuse shader
):
<ignore_js_op>
注意SetPass calls:4
因此咱們要對這一場景的這些material進行處理:
第二步:對於使用相同shader的材質,將他們的貼圖作成一個圖集(Atlas)
在咱們的例子中,咱們有2個texture,每個着色的漫反射貼圖使用一個正常的法線貼圖和一個基本texture,因此咱們須要作的是將這兩個texture這樣設置:
<ignore_js_op>
保存這些texture在項目視圖中,咱們一下子將須要它們:
<ignore_js_op>
第三步:建立一個material,它將包含shader和圖集(Atlas)
建立一個material,並將兩張貼圖和Shader
(Bumped Diffuse)
賦予給
材質:
<ignore_js_op>
第四步:
網格的全部UV從新映射,使用Shader適配圖集的座標
這個修改能夠用任何建模軟件(Maya/ 3D studio / Max / Blender /等)來操做。
這是很無聊的又很必要的步驟,包括修改網格的UV座標而且使它們適配texture圖集(咱們第二步建立的texture圖集)。
因此咱們要作的是,將每個UV座標設置爲[ 0,0–1,1 ],咱們能夠將他們從新定位在一個[ 0,0-1,1 ]的較小的子範圍中,這樣就與步驟2中創造的圖集相匹配。
<ignore_js_op>
接着……咱們爲每一個網格共享相同的shader。
第五步:用你映射的網格建立出步驟3的material
咱們基本上完成了!咱們還有幾步要作:
1。選擇你全部的UV映射網格,用他們替換舊網格的位置而且停用舊的網格
2。將步驟3
創造的材質賦予
全部的UV映射網格。
<ignore_js_op>
到了這裏,咱們就結束了!,如今讓咱們點擊play看看:
<ignore_js_op>
在優化前,若是你回到步驟1,咱們有4個SetPass call,如今優化已經完成,咱們最終就有1個 SetPass call!太驚人了!在這種狀況下,它的75%draw call減小了。
在這裏,你應該知道多瞭解些在standard shader上優化過程是如何作的。我在開頭寫了,standard shader內部「變化」和愈來愈快/慢,取決於你使用的
texture slots
。就是說,咱們必須收集咱們對象的material,若是他們使用了texture也使用的Standard shader。
經過使用的texture歸類這些對象,咱們只須要遵循咱們用於全部shader的如下幾個步驟:
1.整理全部的material而且經過他們的shader類型收集他們
2.
第二步:對於使用相同shader的材質,將他們的貼圖作成一個圖集(Atlas)
3.
建立一個material,它將包含shader和
圖集(Atlas)
4.
網格的全部UV從新映射,使用Shader適配圖集的座標
5.用映射的網格建立出步驟3的material
這是我爲測試建立的一個小場景:
<ignore_js_op>
若是你比較原始場景的draw call(91)和優化後場景的draw call(22),你能夠看到,有75%draw call減小了!,太驚人了!
此外,若是你能夠嘗試儘量多的組合網格,這也有不少幫助!。