本文爲大(dà)家分(fēn)享Unity 5中标準著(zhe)色器的(de)簡單概念,并分(fēn)析如何減少Draw Call(Unity 5中顯示爲SetPass calls,下(xià)文的(de)Draw Call皆表示SetPass calls)。
标準著(zhe)色器是基于物(wù)理(lǐ)的(de)著(zhe)色器,可(kě)以正确渲染各種光(guāng)照(zhào)條件下(xià)的(de)效果,支持跨平台,擁有可(kě)以啓用(yòng)不同功能著(zhe)色器的(de)紋理(lǐ)字段。
标準著(zhe)色器會根據紋理(lǐ)字段所選用(yòng)的(de)紋理(lǐ)改變自身包含的(de)功能,從而影(yǐng)響這(zhè)個(gè)Shader的(de)執行速度。盡管他(tā)們都是使用(yòng)的(de)标準著(zhe)色器,但***終生成的(de)著(zhe)色器是不同的(de),如下(xià)圖:
這(zhè)兩個(gè)著(zhe)色器在渲染場(chǎng)景時(shí)是完全不同的(de)(盡管都是“标準著(zhe)色器”),因此如果想減少Draw Call,就要以完全不同的(de)方式來(lái)處理(lǐ)這(zhè)兩個(gè)著(zhe)色器。
先介紹通(tōng)用(yòng)的(de)減少Draw Call的(de)方法,然後再講解在Unity 5中使用(yòng)标準著(zhe)色器時(shí)如何減少Draw Call。
手動減少Draw Call
不論是Unity或其它引擎,減少Draw Call無非就是盡可(kě)能少用(yòng)材質。
所以減少材質基本上有以下(xià)幾步:
1. 按照(zhào)所用(yòng)的(de)著(zhe)色器類型對(duì)材質進行分(fēn)類及整合。
2. 将使用(yòng)同一著(zhe)色器的(de)材質的(de)紋理(lǐ)合并爲紋理(lǐ)集。
3. 創建一個(gè)材質,讓其包含著(zhe)色器及第二步創建的(de)紋理(lǐ)集。
4. 重新對(duì)用(yòng)到該著(zhe)色器的(de)網格進行紋理(lǐ)映射以匹配紋理(lǐ)集中的(de)紋理(lǐ)坐(zuò)标。
5. 将第三步創建的(de)材質賦給重新編輯後的(de)網格。
***步按照(zhào)所用(yòng)的(de)著(zhe)色器類型對(duì)材質進行分(fēn)類及整合
盡量使用(yòng)***簡單的(de)場(chǎng)景來(lái)說明(míng),這(zhè)裏隻有4個(gè)材質,每個(gè)材質都使用(yòng)Bumped Diffuse著(zhe)色器,如下(xià)圖:
注意上圖的(de)SetPass calls是4。
對(duì)于此場(chǎng)景要處理(lǐ)的(de)材質如下(xià)圖:
第二步将使用(yòng)同一著(zhe)色器的(de)材質的(de)紋理(lǐ)合并爲紋理(lǐ)集
這(zhè)裏每個(gè)著(zhe)色器有兩張紋理(lǐ),一張基本紋理(lǐ)和(hé)一張Bumped Diffuse要用(yòng)的(de)法線紋理(lǐ),所以需要的(de)紋理(lǐ)貼圖如下(xià):
第二步将使用(yòng)同一著(zhe)色器的(de)材質的(de)紋理(lǐ)合并爲紋理(lǐ)集
這(zhè)裏每個(gè)著(zhe)色器有兩張紋理(lǐ),一張基本紋理(lǐ)和(hé)一張Bumped Diffuse要用(yòng)的(de)法線紋理(lǐ),所以需要的(de)紋理(lǐ)貼圖如下(xià):
第三步創建材質,讓其包含著(zhe)色器及第二步創建的(de)紋理(lǐ)集
創建材質,并設置好兩個(gè)紋理(lǐ)和(hé)著(zhe)色器(本例是“Bumped Diffuse”)如下(xià)圖:
第四步重新對(duì)網格進行紋理(lǐ)映射以匹配紋理(lǐ)集中的(de)坐(zuò)标
這(zhè)一步可(kě)在任意3D編輯器中完成(Maya、3D studio 、Max 、Blender 等)。
該步驟比較耗時(shí),需要重新設置網格的(de)UV坐(zuò)标以對(duì)齊到第二步所創建的(de)紋理(lǐ)集中的(de)像素。如下(xià)圖:
對(duì)所有使用(yòng)同一著(zhe)色器的(de)網格重複以上步驟。
第五步将第三步創建的(de)材質賦給重新編輯後的(de)網格
還(hái)要進行以下(xià)兩個(gè)步驟:
1. 用(yòng)所有重新映射後的(de)網格替換之前的(de)網格,并禁用(yòng)舊(jiù)的(de)網格。
2. 将第三步創建的(de)材質賦給重新映射後的(de)網格。
如下(xià)圖:
運行效果如下(xià)圖:
回到***步,優化(huà)之前的(de)SetPass calls是4,而優化(huà)後減少***1,本例中Draw Call減少了(le)75%。
在Unity 5中使用(yòng)标準著(zhe)色器時(shí)減少Draw Call
如之前所說,标準著(zhe)色器會根據所用(yòng)到的(de)紋理(lǐ)變得(de)更快(kuài)或更慢(màn),與此同時(shí)渲染方式也(yě)會不同。所以如果材質的(de)紋理(lǐ)使用(yòng)同一标準著(zhe)色器,就可(kě)以将材質合并。例如,合并所有隻有顔色的(de)網格、合并所有隻有Albedo(反射率)紋理(lǐ)的(de)網格等等。按照(zhào)紋理(lǐ)整合好對(duì)象後對(duì)于任意著(zhe)色器都隻需進行上面五個(gè)步驟進行優化(huà),其中的(de)著(zhe)色器就是标準著(zhe)色器的(de)紋理(lǐ)字段。
使用(yòng)标準著(zhe)色器的(de)場(chǎng)景優化(huà)前後對(duì)比圖如下(xià):
可(kě)以看到Draw Call從91減少***22,約降低了(le)75%,如果盡可(kě)能的(de)合并網格效果還(hái)可(kě)以更好。
在Unity中自動減少Draw Call
本文作者Juan制作了(le)插件Pro Draw Call Optimizer,可(kě)以自動根據用(yòng)到的(de)著(zhe)色器類型來(lái)整合對(duì)象,并自動對(duì)所有未優化(huà)的(de)場(chǎng)景進行“加工”。另外如果場(chǎng)景隻用(yòng)到Diffuse和(hé)Bumped Diffuse著(zhe)色器,還(hái)可(kě)以使用(yòng)Juan制作的(de)免費版插件Pro Draw call Optimizer Light。
發表評論
發表評論: