unity中shader的打包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity中shader的打包相关的知识,希望对你有一定的参考价值。

一、我们项目听说不支持shader热更,所以我就想知道为什么。

  打包的程序员说,shader加入在graphics setting的always included shader里可以大大减少AB,而graphics setting而这个文件是在构建安装包时出现在安装包里的,所有shader有点像生成了“内部依赖ab",这个内部ab我们是得不到的,即更新不出去,即如果加了新shader则这个ab发生了改变,依赖它的旧资源的依赖也发生了改变,但是因为此ab在“壳"里,即不能热更出去,所以所有依赖此内部ab的资源,可能都跪了。简单举个例子:

  此内部ab为A,有个资源B依赖一个shader,所以打包时B里有个引用指向A,现在A发生了改变,但不能热更出去,只热更了B,所以B的依赖就木有了。当然,如果是安装的是整包,A就在里面,B的显示就木有问题。

技术分享

    注:上面的“内部依赖ab""A"等用ab来描述,其实是胡诌的,只是想借助ab依赖包的思想,便于理解。

二、我要做一下测试验证一下

  因为资料较少,加上官方文档说的也不详细,参考这博文:unity5.x  shader打包AssetBundle总结,自己进行了各种测试,得到如下结论:

  1.内置shader(比如Mobile/Diffuse,Standard等),如果在Graphics Setting设置了,则不打入各个资源的ab中,而打入构建包中(构建包会稍大),如果不设置就打入各个资源的ab中,不打入构建包(构建包较小);

  2.自定义shader,不管在不在Graphics Setting里设置,都打入各个资源的ab中(除非给shader进行setassetbundlename,即打shader ab),在Graphics Setting里则构建包大一些。

  3.Graphics Setting的Always included Shaders只是在打ab时影响内置shader打不打入资源ab,在构建时影响打不打入构建包中。

三、总结

  所以有2种方式处理shader打包:

  1.不打shader ab。把大量使用的内置shader设置到Graphics setting里,其余的比如其他内置shader和自定义shader可以直接打入各个资源ab里;能热更不在graphics setting里的shader,如果只有内置的在graphics setting里面,则所有自定义的shader都能热更,但是,如果热更大量使用的shader,会使得增量包较大;

  2.打shader ab,能热更所有shader,并且增量包不大。把shader都打入一个ab里,那设不设置Graphics Setting呢?按我的理解,不需要,但unity5.x  shader打包AssetBundle总结说:“需要将shader添加到GraphicsSetting-> always included shader设置中,否则shader也会显示粉红”,但文:此文说:“项目把shader单独打包,引用shader的资源会依赖shader资源包,shader并不需要加入Graphics Settings和Resources文件夹,只要保证shader文件命名没有空格,加载时保证被依赖的shader有优先加载,那结果就会是正常的。”,所以我个人觉得后者才是正确的,为什么我不去测试验证?因为我懒啊,因为我在内网写demo,无法真机测试,自然就不靠谱了,况且已经到了这一步了,以后碰到就简单了。

以上是关于unity中shader的打包的主要内容,如果未能解决你的问题,请参考以下文章

Unity开发bug记录100例子(第1例)——打包后shader失效或者bug

【Unity3D】URP中的打包资源加载

Unity开发bug记录100例子(第1例)——打包后shader失效或者bug

UnityShaderVariant的一些探究心得

Unity5.X打包场景为AssetBundle后,加载场景后烘培灯光贴图不显示

unity-shader变体ShaderVariant