文章出處

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> 

這兩個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減少了!,太驚人了!   
此外,如果你可以嘗試盡可能多的組合網格,這也有很多幫助!。            

文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()