在本文中,我想讨论两个关于使用UE5时遇到的阴影残影问题。

最常见的原因可能有以下两点

  • Virtual Shadow Maps(虚拟阴影贴图)
  • Distance Field Shadows(距离场阴影)

请注意,我并没有涵盖所有关于残影的问题。


Virtual Shadow Maps(虚拟阴影贴图)

一. 如何判断

如何判断是否为 Virtual Shadow Maps (VSM) 导致的问题?

VSM出现的阴影问题时,阴影通常表现为:

  • 撕裂
  • 更新延迟

接下来,使用默认设置的UE5.1演示,并制作一个使用World Position Offset(WPO,世界位置偏移)进行循环移动的材质进行观察。

请添加图片描述
现在球体持续移动,看起来阴影被放置在了错误的位置,且伴随着撕裂和更新迟缓。

这是由UE5的新功能Virtual Shadow Maps(虚拟阴影贴图)引起问题的典型症状。

二. 原因

在这个场景中,有一个Directional Light(定向光)和一个Skylight(天空光)
在UE5中,Directional Light的原本的Cascade Shadow(级联阴影)默认启用为了Virtual Shadow Maps

VSM 为大量细节对象投射的阴影,采取了 动态缓存策略 ,以减轻实时阴影计算的负载。

它将阴影分割成细致的部分和粗糙的部分,并自动判断哪个部分的阴影缓存需要更新,以实现近处细节丰富、远处粗糙的效果。
在这里插入图片描述
让我们实际看一下哪些页面正在被更新。我们选择Viewport中的
Virtual Shadow Maps > Cached Page(缓存页)

更新了阴影信息的部分将显示为红色,而未更新且显示为缓存的部分将显示为绿色。
在这里插入图片描述

可以看到围绕着运动的球体的缓存页都以红色进行了更新,
但是边缘部分是绿色的,也就是没有更新
因此,阴影仍然残留了下来。

根据观察,自动判断哪个部分的阴影缓存需要更新时,只判断了组件的实际更新,而无法考虑到材质中的WPO变化。

三. 解决方法

  1. 如果你的UE版本足够新,首先应该尝试这个方法
    找到使用了WPO移动物体的阴影缓存无效化行为设置,将设置由自动换成始终
    在这里插入图片描述

  2. 如使用较早版本,或仍存在问题,可以尝试不缓存:
    通过使用命令 r.Shadow.Virtual.Cache 0,可以将其设置为不缓存状态(始终持续更新)。
    在执行此命令的情况下查看缓存页
    在这里插入图片描述
    可以看到全部都是红色,整个页面始终处于更新状态。
    由于VSM 不断更新,阴影也不会残留。
    在这里插入图片描述
    然而,这样做会剥夺整个场景中虚拟阴影贴图的缓存优势,因此在负载方面可能不是很理想…除非你十分需要VSM的其他特性(例如软阴影),否则可以回退到旧版本的级联阴影

另外,还有一种比较作弊的方法,可以调整角色的Bounds Scale:

似乎 VSM 的更新范围目前是根据角色的Bounds来确定的。
对于原始球体的Bounds,更新范围如下所示。
在这里插入图片描述

对于在WPO中移动的范围,Bounds较小,因此更新的页面也较小。

让角色的Bounds Scale调整为3
在这里插入图片描述
更新的部分变得更广泛,阴影也能正确绘制!当然了,修改Bound会影响物体的剔除等,需要根据情况实际考量。

LumenVirtual Shadow Maps,虽然这里没有提到Nanite(+Mesh Distance Fields),但它们彼此互补。
因此,关闭其中一个可能会导致问题发生,所以在更改设置时要小心。


Distance Field Shadows(距离场阴影)

Distance Field Shadows(距离场阴影)引起的阴影问题

一. 如何判断

如何判断是否为 Distance Field Shadows(距离场阴影) 导致的问题?
这种问题的阴影通常表现为:

  • 完整的残留
  • 含有软阴影特性

同样在UE5.1中,如果将SkyLight设置为Movable,并且使用材质的World Position Offset对网格进行了偏移,能看到阴影残留在原始网格的位置。
请添加图片描述

而UE4.27中的相同情况不会产生类似的现象
请添加图片描述

二. 原因

这是因为在UE5.1中,默认情况下启用了Generate Mesh Distance Fields,且此时手动禁用了Lumen
请添加图片描述
请添加图片描述
此时,天光使用了距离场阴影,这个阴影通过Mesh Distance Fields(模型距离场)计算得来

Distance Fields( DF 距离场)通常在模型导入时构建,为模型的静态数据。
因此理所当然的,Mesh Distance Fields的生成是在的模型发生任何变形之前,更不会随着WPO改变

这里所描绘的错误阴影是Distance Field Ambient Occlusion (距离场AO)Distance Field Shadow (距离场阴影)

因为DF是静态数据,可以看到阴影仍然保留在网格的原始位置上。
查看模型距离场视图,可以看到DF并不会随WPO移动
在这里插入图片描述

而4.27中没有发生这种情况的原因是默认没有启用网格距离场。
请添加图片描述
当然,在4.27启用生成网格体距离场时与5.1具有相同的现象。


三. 解决方法

  • 启用Lumen
    尽管Lumen在某种程度上也引用了Mesh Distance Fields的机制,但对于不支持Lumen软件光线追踪的部分(如World Position Offset),它会确保外观没有问题。(可能是通过ScreenTrace进行处理吗?)

  • 禁用Distance Field Shadows
    通过取消ActorDetails>Lighting>Affect Distance Field Lighting复选框的选中状态,您可以使该Actor不再使用Distance Field Shadows,从而修复阴影的偏移。
    在这里插入图片描述
    请添加图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐