轉自:
http://www.pencilsquaregames.com/2015/01/reducing-draw-calls-also-named-setpass-calls-on-unity5/
http://forum.china.unity3d.com/thread-15401-1-1.html
本文爲大家分享Unity 5中標準着色器的簡單概念,並分析如何減少Draw Call(Unity 5中顯示爲SetPass calls,下文的Draw Call皆表示SetPass calls)。
標準着色器是基於物理的着色器,可以正確渲染各種光照條件下的效果,支持跨平臺,擁有可以啓用不同功能着色器的紋理字段。
正文開始前先來看一段標準着色器效果的視頻:
標準着色器會根據紋理字段所選用的紋理改變自身包含的功能,從而控制這個shader的執行速度。如下圖,儘管兩個材質使用同一個着色器,但仍有區別:
這兩個着色器在渲染場景時是完全不同的(儘管都是“標準着色器”),因此如果想減少Draw Call,就要以完全不同的方式來處理這兩個着色器。
先介紹通用的減少Draw Call的方法,然後再講解在Unity 5中使用標準着色器時如何減少Draw Call。
手動減少Draw Call
不論是Unity或其它引擎,減少Draw Call無非就是儘可能少用材質。
所以減少材質基本上有以下幾步:
按照所用的着色器類型對材質進行分類及整合。
將使用同一着色器的材質的紋理合併爲紋理集。
創建一個材質,讓其包含着色器及第二步創建的紋理集。
重新對用到該着色器的網格進行紋理映射以匹配紋理集中的紋理座標。
將第三步創建的材質賦給重新編輯後的網格。
第一步,按照所用的着色器類型對材質進行分類及整合
儘量使用最簡單的場景來說明,這裏只有4個材質,每個材質都使用Bumped Diffuse着色器,如下圖:
注意上圖的SetPass calls是4。
對於此場景要處理的材質如下圖:
第二步,將使用同一着色器的材質的紋理合併爲紋理集
這裏每個着色器有兩張紋理,一張基本紋理和一張Bumped Diffuse要用的法線紋理,所以需要的紋理貼圖如下:
將紋理保存到工程以供後續使用:
第三步,創建一個材質,讓其包含着色器及第二步創建的紋理集。
創建材質,並設置好兩個紋理和着色器(本例是“Bumped Diffuse”)如下圖:
第四步,重新對用到該着色器的網格進行紋理映射以匹配紋理集中的紋理座標。
這一步可在任意3D編輯器中完成(Maya、3D studio 、Max 、Blender 等)。
該步驟比較耗時,需要重新設置網格的UV座標以對齊到第二步所創建的紋理集中的像素。如下圖:
對所有使用同一着色器的網格重複以上步驟。
第五步,將第三步創建的材質賦給重新編輯後的網格。
還要進行以下兩個步驟:
用所有重新映射後的網格替換之前的網格,並禁用舊的網格。
將第三步創建的材質賦給重新映射後的網格。
如下圖:
運行效果如下圖:
回到第一步,優化之前的SetPass calls是4,而優化後減少至1,本例中Draw Call減少了75%。
在Unity 5中使用標準着色器時減少Draw Call
如之前所說,標準着色器會根據所用到的紋理變得更快或更慢,與此同時渲染方式也會不同。所以如果材質的紋理使用同一標準着色器,就可以將材質合併。例如,合併所有隻有顏色的網格、合併所有隻有Albedo(反射率)紋理的網格等等。按照紋理整合好對象後對於任意着色器都只需進行上面五個步驟進行優化,其中的着色器就是標準着色器的紋理字段。
可以看到Draw Call從91減少至22,約降低了75%,如果儘可能的合併網格效果還可以更好。
在Unity中自動減少Draw Call
本文作者Juan製作了插件Pro Draw Call Optimizer,可以自動根據用到的着色器類型來整合對象,並自動對所有未優化的場景進行“加工”。另外如果場景只用到Diffuse和Bumped Diffuse着色器,還可以使用Juan製作的免費版插件Pro Draw call Optimizer Light。
付費版插件Pro Draw Call Optimizer地址:
https://www.assetstore.unity3d.com/en/#!/content/16538
免費版插件Pro Draw call Optimizer Light地址:
https://www.assetstore.unity3d.com/en/#!/content/16888
原文鏈接:http://www.pencilsquaregames.com ... ss-calls-on-unity5/
原文作者:Juan
轉載請註明來源:Unity官方中文社區 (http://forum.china.unity3d.com/forum.php)。請勿私自更改任何版權說明信息。