Unity 手机端光照贴图切换全坑实录(变暗,错乱,数量增加)整理

过程复现

故事背景:版本2018(应该都是有这个问题),线性空间
故事过程:
1.首先一开始的时候我们有一个主场景Main,
2.然后使用Additive方式加载场景A(这里也可以加载多个场景,结果是一样的),
3.将A设置为主场景
4.对LightmapSettings.lightmaps进行变更同时保留变更前的光照数据数组,发现没有问题,效果是正确的
5.切换场景B=>a.恢复LightmapSettings.lightmaps为保存的数据。b.卸载场景A。 c.加载场景B
6.切换回场景A

为什么修改LightmapSettings.lightmaps的某个数据无法完成光照贴图的替换

这个直接跳转我的这个文章

切换光照贴图后,再次切换场景,之后场景变暗

在第5步到场景B,此时场景B已经使用光照贴图的已经变黑了,再次返回A发现场景A也变成了黑色。经过我的缜密排查发现:unity_Lightmap_HDR这个全局的shader参数在切换场景后发生了变化,从(4.59,1,0,0)变成了(1,1,0,0)。对于4.59这个数值,大家反映是不是gamma矫正pow(2,2.2)。但是这个1怎么来的我就猜不出来了。
在UnityCG.cginc中,我们看到如下代码,在解析光照贴图时,unity内置会使用unity_Lightmap_HDR这个系数,所以数据的变更会影响到光照贴图的解析错误。

half4 unity_Lightmap_HDR;

inline half3 DecodeLightmap( fixed4 color )
{
    return DecodeLightmap( color, unity_Lightmap_HDR );
}

经过测试

unity_Lightmap_HDR Linear Gamma
安卓 场景烘焙:(4.6,1,0,0)未烘焙:(1,1,0,0) 场景烘焙:(2,1,0,0)未烘焙:(1,1,0,0)
PC 场景烘焙:(34.5,2.2,0,1)未烘焙:(1,1,0,0) 场景烘焙:(5,1,0,1)未烘焙:(1,1,0,0)

unity每帧都会对unity_Lightmap_HDR的数值进行设置,设置时机在OnPreRender()函数之后,OnPostRender()前进行,所以我们要放弃用代码设置unity_Lightmap_HDR的数值的方式

解决方案1-修改源码

直接把DecodeLightmap( color, unity_Lightmap_HDR );修改成DecodeLightmap( color, half4(4.6,1,0,0))那不香么?确实可以,如果我们对项目中的光照贴图进行统一规范,根据项目的色彩空间直接写死数据,或者换成我们自定义的数据,就可以完成了,但是这样我们需要重写或者修改UnityCG.cginc相关的东西了。

解决方案2-将Main场景进行烘焙

大部分情况下,我们的Mian的场景作为主入口场景,基本上是不会有美术资源的,所以Main的场景unity_Lightmap_HDR为(1,1,0,0),当我们卸载A场景后,Main重新回到主场景,此时会设置unity_Lightmap_HDR为(1,1,0,0),当我们加载B场景后及时B场景中由烘焙信息,也依旧没法改变unity_Lightmap_HDR的数值,我觉得这里就是Unity的Bug的地方了。如果Main场景没有烘焙且我们没有修改过LightmapSettings.lightmaps这个数据,则在切换到B场景后unity_Lightmap_HDR的数值为(4.6,1,0,0),一旦修改LightmapSettings.lightmaps就会失效。
所以我们将Main场景进行烘焙,则在切回Main场景时unity_Lightmap_HDR数值仍为(4.6,1,0,0)。

光照贴图数量变长问题

通过上面的解决方法后,我们发现效果对了,但是LightmapSettings.lightmaps的长度一致在叠加,比如Main有2张光图,A场景有2张,B场景有两张,当我们执行到第6步时发现光照贴图的长度居然变成了6,然后反复执行5,6操作,光照贴图长度居然一直增加。当初我还是在手机测试的时候发现内存泄露发现的,毕竟谁也不会闲着没事输出光图的长度,而且PC端又不会出现这种问题。

解决方案-卸载场景时手动设置光图

后来的解决方法就是在卸载场景时,手动将他的光图数据清空,也就是说我们返回Main场景时,将此事的LightmapSettings.lightmaps设置为只有Main的光图。惊不惊喜,意不意外,这么操作居然是可行的。。坑还是深啊!~~

总结

哎~~写个东西还真是累!

猜你喜欢

转载自blog.csdn.net/u010778229/article/details/118025823