本文记录光照贴图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相关宏没有开启。
根据“运行中光照相关重建可能与光源物件有关”进行测试:
- 在Game场景中创建一个能烘出shadowmask的环境(应至少包括MixedLight,静态物体,相机),烘焙。
- 刚刚用于烘焙的物件、相机等等均可以删除;MixedLight不可以隐藏或删除,不可以有任何可能导致MixedLight断引用的操作(如unpackPrefab),其CullingMask也必须包含运行中加载出的场景Prefab的tag(Everything即可),但可以修改其颜色、位置等等。
- 运行中加载任意场景Prefab(其中可以不带mixedLight等等)、shadowmask正常;FrameDebugger中看到的渲染都很合理。
结论:必须存在一个“曾用于烘焙”的MixedLight,且渲染的物体必须有受该MixedLight的光照,渲染时才会触发SHADOW_SHADOWMASKS和LIGHTMAP_SHADOW_MIXING宏并正常渲染shadowmask
最终解决方案:在Game场景中放一个默认的MixedLight,刚好它也代替各个场景自身的MixedLight,省的打进prefab里了;场景MixedLight的方向等等属性可以通过工具同步到运行中;如果以后有场景需要多个MixedLight,可以再研究能不能支持。
关于”运行中光照相关重建可能与光源物件有关”这个猜测,在unity中有相关tips可以印证: