0%

光照贴图动态加载及踩坑

本文记录光照贴图LightingMode背后的逻辑、以及光照和ShadowMask之间隐含的关系。

LightingMode的官方解释整理:

Subtractive

Static Dynamic
直接光照:烘焙Lightmap 直接光照:实时的
间接光照:烘焙Lightmap 间接光照:烘焙LightProbes
来自static物件的所有阴影:烘焙Lightmap 来自static物件的所有阴影:烘焙LightProbes
来自dynamic物件的主灯光阴影:实时shadowmap(distance内) 来自dynamic物件的主灯光阴影:实时shadowmap(distance内)

LIGHTMAP_SHADOW_MIXING宏不会开启。

Baked Indirect

Static Dynamic
直接光照:实时的 直接光照:实时的
间接光照:烘焙Lightmap 间接光照:烘焙LightProbes
来自static物件的所有阴影:实时shadowmap(distance内) 来自static物件的所有阴影:实时shadowmap(distance内)
来自dynamic物件的所有阴影:实时shadowmap(distance内) 来自dynamic物件的主灯光阴影:实时shadowmap(distance内)

LIGHTMAP_SHADOW_MIXING宏开启。

Shadowmask

Static Dynamic
直接光照:实时的 直接光照:实时的
间接光照:烘焙Lightmap 间接光照:烘焙LightProbes
来自static物件的所有阴影:烘焙shadowmask(distance内) 来自static物件的所有阴影:LightProbes(distance内)
来自static物件的所有阴影:烘焙shadowmask(distance外) 来自static物件的所有阴影:烘焙shadowmask(distance外)
来自dynamic物件的所有阴影:实时shadowmap(distance内) 来自dynamic物件的主灯光阴影:实时shadowmap(distance内)

LIGHTMAP_SHADOW_MIXING宏开启,SHADOWS_SHADOWMASK开启

Distance Shadowmask

Static Dynamic
直接光照:实时的 直接光照:实时的
间接光照:烘焙Lightmap 间接光照:烘焙LightProbes
来自static物件的所有阴影:实时shadowmap(distance内) 来自static物件的所有阴影:实时shadowmap(distance内)
来自static物件的所有阴影:烘焙shadowmask(distance外) 来自static物件的所有阴影:烘焙shadowmask(distance外)
来自dynamic物件的所有阴影:实时shadowmap(distance内) 来自dynamic物件的主灯光阴影:实时shadowmap(distance内)

LIGHTMAP_SHADOW_MIXING宏关闭,SHADOWS_SHADOWMASK开启

运行中ShadowMask不生效相关踩坑:

在原美术场景中烘焙ShadowMask效果均正常,而在Game场景中加载场景Prefab和ShadowMask后不生效。经检查ShadowMask加载正常,offset设置正常,但FrameDebugger中发现ShadowMask相关宏没有开启。

根据“运行中光照相关重建可能与光源物件有关”进行测试:

  1. 在Game场景中创建一个能烘出shadowmask的环境(应至少包括MixedLight,静态物体,相机),烘焙。
  2. 刚刚用于烘焙的物件、相机等等均可以删除;MixedLight不可以隐藏或删除,不可以有任何可能导致MixedLight断引用的操作(如unpackPrefab),其CullingMask也必须包含运行中加载出的场景Prefab的tag(Everything即可),但可以修改其颜色、位置等等。
  3. 运行中加载任意场景Prefab(其中可以不带mixedLight等等)、shadowmask正常;FrameDebugger中看到的渲染都很合理。

结论:必须存在一个“曾用于烘焙”的MixedLight,且渲染的物体必须有受该MixedLight的光照,渲染时才会触发SHADOW_SHADOWMASKS和LIGHTMAP_SHADOW_MIXING宏并正常渲染shadowmask

最终解决方案:在Game场景中放一个默认的MixedLight,刚好它也代替各个场景自身的MixedLight,省的打进prefab里了;场景MixedLight的方向等等属性可以通过工具同步到运行中;如果以后有场景需要多个MixedLight,可以再研究能不能支持。

关于”运行中光照相关重建可能与光源物件有关”这个猜测,在unity中有相关tips可以印证:

lightmap_tips