在Unity 5中如何減少Draw Call

2021-08-04 01:57:07 字數 1975 閱讀 8707

**:

本文為大家分享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。

unity5, 在mac下多開

用這個方法可以實現unity的多開。所以 1,開啟終端。2,cd 進入使用者目錄,然後執行命令 則彈出乙個unity啟動對話方塊,如果再次執行上面命令則會彈出第二個unity啟動對話方塊。如圖 這樣就實現了多開。補充 1,相同的工程不能多開,這個非常合理,沒啥可說的。2,要想讓unity啟動時顯示啟...

關於unity5滑鼠在物體上的檢測相關問題

1 滑鼠檢測事件有onmouseenter onmouseexit onmousehover onmouseenter 只在滑鼠第一次移動到物體上時會出發一次,onmouseexit 只在滑鼠移出物體上時觸發一次 onmousehover 只要滑鼠在物體上會一直觸發。2 unity滑鼠事件的觸發條件...

Unity5特殊目錄及其目錄中指令碼的編譯順序

特殊目錄中的指令碼編譯順序 assets目錄包含了unity中要用到的所有資源,專案檢視就是直接包含資源目錄的類容。所有放在此目錄下的指令碼都將當作editor指令碼而不是執行時指令碼,這裡裡面的指令碼被設計用來增加編輯器功能。editorguiutility.load函式載入資源時搜尋的目錄,此目...