如何避免 Unity Complie 所有标准着色器变体

Mar*_*sir 5 unity-game-engine

Graphics中添加Standard Shader —— Always Include Shaders时,Unity总是卡在sharedassets0.asset中。我知道它的统一性符合背景中的着色器变体。它大约有 60000 个变体,这使得 .apk 大小比正常大小大三倍。并且构建需要很长时间(几个小时),即使是一个空项目。如果我从列表中删除着色器,当我从资产包加载模型时,它将是粉红色的。只将标准添加到list,那么一切就ok了!有什么办法可以解决这个问题吗?请帮帮我!我用谷歌搜索了所有我能用的谷歌!

Chu*_*hao 4

编辑:添加了 Unity 2018.2,IPreprocessShaders其描述如下: https: //blogs.unity3d.com/2018/05/14/stripping-scriptable-shader-variants/ShaderCompilerData您可以在 IList< >中查看每个单独的着色器关键字组合并删除您想要的确定你不需要。这个 API 并不复杂,但标准着色器关键字没有很好的文档记录。有些关键字对应于 enum,BuiltinShaderDefine而另一些则不是。我最终使用这个预处理器来删除任何ShaderCompilerData打开的BuiltinShaderDefine.UNITY_HARDWARE_TIER1,BuiltinShaderDefine.UNITY_HARDWARE_TIER2INSTANCING_ON(这不在枚举中BuiltinShaderDefine),因为我确信我们没有使用质量设置切换和实例化。

Unity Shader Variant Collections 的工作方式有点不稳定。我最终使用了一个名为“ Shader Control ”的插件来清理混乱。但这个过程仍然远非令人愉快,因为当您删除关键字时,您有可能会破坏某些东西。

我能想到的最好的解决方案是在项目开始时删除所有“内置着色器”(也许不是“延迟”,因为您正在使用延迟渲染)和“始终包含着色器”,如果有人需要内置着色器着色器,从 Unity 下载存档下载“Builit in Shaders”,然后仅将需要的部分导入回项目。这样您就可以:

  • 对内置着色器有 100% 的控制
  • 仅编译您使用的着色器
  • 避免 AssetBundle 中的着色器重复(如果打包引用默认导入着色器的内容,则每个 AssetBundle 的着色器都会重复)

但这个“最佳解决方案”当然更多的是事后诸葛亮,并且对您当前的情况没有帮助。尝试一下着色器控制。