好久没有写博客了,距离上次的 图文混排第一部分,应该才过去一天吧?(笔者实在太慢)
最近在做安卓项目的打包,发现场景加载后,在不给渲染光照信息(Lightmap Static)的时候,表现还算正常,我们先看看还算正常的情况图
我们可以看到,在不给与光照信息的时候,这种情况还算正常(什么是光照信息??看下图)
这次的问题我在重复下:shader渲染光照后场景组件等表现黑色问题!shader渲染光照后场景组件等表现黑色问题!shader渲染光照后场景组件等表现黑色问题!
我们再来看看我们今天需要解决的详情图:
what??????????????????为什么会有这样的问题?吓的作者赶紧百度了两三天!!!!!!
最后什么有用的信息都没有。
我们现在来思考问题的产生因素:
我们一点一点来分析
我仔细检查了下shader 发现中有一句代码
#pragma surface surf Lambert alphatest:_Cutoff
可见是支持兰伯特反射的。那么我们的shader没有问题!排除三
这点很重要,也就是网上说的把 shader加入到 Project Setting -> Graphics -> Always Included Shaders
如果我真的需要把它放在列表里面让Unity帮我去加载,那么我就不会有第一点的疑虑(当然这样操作可以解决我们的问题,但是会有隐患,后文会提到)
既然不加入列表,那么怎么去解决?
我们都知道Unity在成包的时候shader都会帮我们去编译对应的平台(除非你不加入 Always Included Shaders 和 打Assetbundle)的渲染代码,那么既然是Unity帮我编译,那么是不是问题出现在编译的过程中?
好!定位问题,我们看看 问题shader
492kb,或许没有问题也或许有问题,那么我们该怎么去解决呢?拆包看里面的shader编译的代码(不好意思,作者看不懂)
那么又只能google了,这次学乖了,不baidu了,既然问题已经定位到是编译时机的问题,那么几个小时的google和猛如虎的乱操作后,问题解决了。
问题根本:
Project Setting -> Graphics -> Shader Stripping -> Lightmap Modes
这里,
我们看到,这里就是Unity 有可能帮我们接管到了实时光源,那么就有可能出现上述的问题 Shader渲染光照后场景组件等表现黑色问题。
我们只需要 按需要去保留即可,如果是烘焙,不要把实时光打开!!!!
选择完毕后,切记随手按下 CTRL + S 我不晓得Unity会不会有什么骚操作导致失败,然后重启Unity
然后重新打包shader
我们发现shader大了许多!!在这还不能证明它是准确的,那么我们进项目看看
正确了!猜想是正确的,Unity在帮我们编译shader的时候,应该是做了某些优化,减少shader变种!
什么是shader变种?
这个就是shader变种,如果shader变种数量非常多,那么我们的shader加载的第一次会非常的卡,所以unity可能是在这方面做了优化。
前文我也说了为什么不把shader 加入到 Always Included Shaders 一但shader的变种数量剧增,那么可想而知,Unity在初始化加载shader可以卡到你怀疑人生,大家可以试一下把 Standard shader 加入后试一试。
至于图文混排篇,我可能下个月才会继续写,因为实在抽不出手来写。