1. 遇到的問題
最常見的是打包到手機后效果與PC上不一致,具體情況比如:
- 光照貼圖失效
- 霧失效
- 透明或者cutoff失效
以上首先需要檢查的地方是Shader變體的編譯設置
2. 超級着色器編譯成N個變體
如果需要多吧功能類似的shader, 比把透明,Cutoff和不透明等多個功能集合到一個Shader上,通常把這樣的Shader稱之為"超級着色器(uber shader)"
實際上這種集合是對shader代碼的分支管理, 通過開關不同的宏代碼實現功能的切換, 所以在Unity打包時,需要預編譯所有可能出現的分支版本.
變體的數量可能非常恐怖, Unity blog有一篇詳提到過變體的編譯: Stripping scriptable shader variants
3. 在Unity中管理shader變體編譯
3.1 Shader Stripping
菜單位置: Edit - Graphic Setting - Shader Stripping
Shader Stripping設置總結
- Shader Stripping包括以下幾個方面:
- 光照模式
- 霧模式
- GPU Instance
- 預加載變體
- 按實際使用勾選,如果全勾選, 打包shader幾個小時都編不完
- 如果選擇Auto, 結果可能不受控制
3.2 Shader Variant Collection
手動創建
手動修改
選中存出來的Shader Variants Collection文件, 直接在Inspector面板中點擊+ -號添加或刪除:
自動生成
Edit - Project Settings - Graphics
運行游戲, 讓游戲跑一會, 按下"Save to asset" 按鈕, 可以把自動搜集打開過場景的shader變體,存到一個文件中:
通過這個變體集合文件進行依賴打AssetBundle包的方式可以實現shader變體的預加載.
注意
自動搜集的功能不夠可靠, 做完還是要打包驗證,查缺補漏去除冗余是必須的.
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">