在本文中,我想讨论两个关于使用UE5时遇到的问题,即残影问题。
第一个问题是Distance Field Shadows(距离场阴影),第二个问题是Virtual Shadow Maps(虚拟阴影贴图)。
请注意,我并没有涵盖所有关于残影的问题。
Distance Field Shadows(距离场阴影)引起的阴影问题
在UE5.1中,如果将SkyLight设置为Movable,并且使用材质的World Position Offset对网格进行了偏移,会导致阴影残留在原始网格的位置。
而UE4.27中的相同情况不会产生类似的现象
这是因为在UE5.1中,默认情况下启用了"Generate Mesh Distance Fields",并且手动禁用了Lumen。
通过Mesh Distance Fields生成的网格是在任何变形(如World Position Offset)之前创建的。这里所描绘的扭曲阴影是Distance Field Ambient Occlusion。
Distance Field Ambient Occlusion参考了Mesh Distance Fields,因此阴影仍然保留在网格的原始位置上。
而4.27中没有发生这种情况的原因是默认没有启用网格距离场。
当然,在4.27启用生成网格体距离场时与5.1具有相同的现象。
以下是一些解决方法
-
启用Lumen
尽管Lumen在某种程度上也引用了Mesh Distance Fields的机制,但对于不支持Lumen软件光线追踪的部分(如World Position Offset),它会确保外观没有问题。(可能是通过ScreenTrace进行处理吗?) -
禁用Distance Field Shadows
通过取消Actor的Details>Lighting>Affect Distance Field Lighting复选框的选中状态,您可以使该Actor不再使用Distance Field Shadows,从而修复阴影的偏移。
Virtual Shadow Maps(虚拟阴影贴图)时出现的阴影问题,
接下来,我们将再次使用默认设置的UE5.1,并使用World Position Offset(世界位置偏移)进行观察。
这次,我们将让球体持续移动。
看起来阴影被放置在了错误的位置。这个问题不是由Mesh Distance Fields(网格距离场)引起的,而是由UE5的新功能Virtual Shadow Maps(虚拟阴影贴图)引起的。
在这个场景中,有一个Directional Light(定向光)和一个Skylight(天空光)。在UE5中,Directional Light的Cascade Shadow(级联阴影)部分被替换为Virtual Shadow Maps。
Virtual Shadow Maps在动态地为大量细节对象投射阴影时采取了缓存的策略,以减轻负载。
它将阴影分割成细致的部分和粗糙的部分,并判断哪个部分的阴影缓存需要更新,以实现近处细节丰富、远处粗糙的效果。
让我们实际看一下哪些页面正在被更新。我们选择Viewport中的Virtual Shadow Maps > Cached Page。
更新了阴影信息的部分将显示为红色,而未更新且显示为缓存的部分将显示为绿色。
然后,围绕着运动的球体的页面都以红色进行了更新,
但是边缘部分是绿色的,也就是没有更新。
因此,阴影仍然显示出来。
以下是一些解决方法
如果你的UE版本足够新,首先应该尝试将设置阴影换成无效化行为设置为始终
如果仍存在问题,可以尝试不缓存:
通过使用命令 r.Shadow.Virtual.Cache 0,可以将其设置为不缓存状态(始终持续更新)。
在执行此命令的情况下查看缓存页面。
可以看到全部都是红色,整个页面始终处于更新状态。
当然,由于不断更新,阴影也不会残留。
然而,这样做会剥夺整个场景中虚拟阴影贴图的缓存优势,因此在负载方面可能不是很理想…
- 调整角色的Bounds Scale
似乎Virtual Shadow Maps的更新范围是根据角色的Bounds来确定的。
对于原始球体的Bounds,更新范围如下所示。
对于在World Position Offset中移动的范围,Bounds较小,因此更新的页面也较小。
让角色的Bounds Scale调整为3。
更新的部分变得更广泛,阴影也能正确绘制!
Lumen和Virtual Shadow Maps,虽然这里没有提到Nanite(+Mesh Distance Fields),但它们彼此互补。
因此,关闭其中一个可能会导致问题发生,所以在更改设置时要小心。