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 contenteditable="false" style="display: none;">