前言
UE4的场景阴影采用静态和实时混合的计算方式:CSM(级联阴影)范围内的阴影通过实时计算得到,CSM范围外的阴影信息从预烘焙的静态贴图中获取。图1:场景混合阴影效果示例
上图中,方块和地板为场景静态模型,近处地板上阴影清晰的部分为方块和角色的实时阴影,远处红框选中部分为方块的静态阴影。
这里把地板的LightMap烘焙质量调低,同时把CSM的清晰度调高,让CSM范围边界更明显。
预烘焙的灯光信息存储在离线构建的贴图“簇”中,包含存储颜色信息的LightMap贴图和存储静态阴影信息的ShadowMask贴图。图2:ShadowMask贴图
上图为所示场景的ShadowMask贴图,其中红框选中部分为地板在ShadowMask贴图中的占用部分。
在移动端的灯光方案中,一般不会为场景开启实时阴影。没有场景实时的阴影遮挡,角色能否获取场景阴影信息用于渲染呢?
实现
在光源方向不变的前提下,场景静态阴影跟实时阴影的信息是一致的,角色虽然没有静态阴影信息,但所处的地面静态模型有。
实现过程为:在角色位置向下Trace地面,获取碰撞地面模型关联的ShadowMask贴图和坐标ScaleBias,再根据碰撞三角面插值得到角色位置的LightMapUV坐标,最后用该坐标结合ScaleBias去采样ShadowMask贴图。
1.获取ShadowMask贴图
静态Mesh烘焙相关的LightMap、ShadowMask贴图等通过FPrimitiveSceneProxy的FLightCac