在unity5中減小Draw Calls(SetPass Calls)[轉]

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.

 

 
 
在Unity中用手動方式下降Draw Call
 
若是咱們想減小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減小了。             
在Unity5中減小繪製調用的標準着色         
在這裏,你應該知道多瞭解些在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減小了!,太驚人了!   
此外,若是你能夠嘗試儘量多的組合網格,這也有不少幫助!。            
相關文章
相關標籤/搜索