【Unity】shader渲染光照后场景组件等表现黑色问题

Shader渲染后场景组件等表现黑色问题

好久没有写博客了,距离上次的 图文混排第一部分,应该才过去一天吧?(笔者实在太慢)

步入正题

最近在做安卓项目的打包,发现场景加载后,在不给渲染光照信息(Lightmap Static)的时候,表现还算正常,我们先看看还算正常的情况图

【Unity】shader渲染光照后场景组件等表现黑色问题_第1张图片
这次的主角是蓝色水晶,其他的不用理会。

我们可以看到,在不给与光照信息的时候,这种情况还算正常(什么是光照信息??看下图)

【Unity】shader渲染光照后场景组件等表现黑色问题_第2张图片
怎样有印象了吧?我们继续。

这次的问题我在重复下:shader渲染光照后场景组件等表现黑色问题!shader渲染光照后场景组件等表现黑色问题!shader渲染光照后场景组件等表现黑色问题!

我们再来看看我们今天需要解决的详情图:

【Unity】shader渲染光照后场景组件等表现黑色问题_第3张图片
【Unity】shader渲染光照后场景组件等表现黑色问题_第4张图片

what??????????????????为什么会有这样的问题?吓的作者赶紧百度了两三天!!!!!!

最后什么有用的信息都没有。

我们现在来思考问题的产生因素:

  • 第一点:我们的shader是打成assetbundle来加载的。
  • 第二点:为什么我给了光照信息会变得更黑?
  • 第三点:shader为什么不接收我的光照信息?

我们一点一点来分析

shader为什么不接收我的光照信息?

我仔细检查了下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渲染光照后场景组件等表现黑色问题_第5张图片
我们看到,这里就是Unity 有可能帮我们接管到了实时光源,那么就有可能出现上述的问题 Shader渲染光照后场景组件等表现黑色问题。

我们只需要 【Unity】shader渲染光照后场景组件等表现黑色问题_第6张图片 按需要去保留即可,如果是烘焙,不要把实时光打开!!!!

选择完毕后,切记随手按下 CTRL + S 我不晓得Unity会不会有什么骚操作导致失败,然后重启Unity

然后重新打包shader

在这里插入图片描述
我们发现shader大了许多!!在这还不能证明它是准确的,那么我们进项目看看

【Unity】shader渲染光照后场景组件等表现黑色问题_第7张图片

正确了!猜想是正确的,Unity在帮我们编译shader的时候,应该是做了某些优化,减少shader变种!

什么是shader变种?

【Unity】shader渲染光照后场景组件等表现黑色问题_第8张图片
这个就是shader变种,如果shader变种数量非常多,那么我们的shader加载的第一次会非常的卡,所以unity可能是在这方面做了优化。

前文我也说了为什么不把shader 加入到 Always Included Shaders 一但shader的变种数量剧增,那么可想而知,Unity在初始化加载shader可以卡到你怀疑人生,大家可以试一下把 Standard shader 加入后试一试。

至于图文混排篇,我可能下个月才会继续写,因为实在抽不出手来写。

你可能感兴趣的:(Unity基础)