距离场环境遮挡

images/DistanceFieldAmbientOcclusion_Header.jpg

本页面的内容:

一个新功能可从有向距离场体(沿每个刚性物体预计算)生成中量的环境遮挡。该功能也将生成可移动天空光照的阴影。它支持动态场景变化 - 可移动或隐藏刚性网格体并影响遮挡。与屏幕空间环境遮挡不同,遮挡是从世界空间遮挡器进行计算,因此画外丢失数据将不会形成穿帮。

此动态环境遮挡解决方案存在一些扩散限制,以便支持动态场景变化,因此并不适用于所有项目。需要特别指出的是,只支持轻微的非等分缩放(挤压)。此外,映射到每个物体上的体积纹理较小,因此大型静态网格体的精度较差。

只有静态网格体组件、范例静态网格体组件、植物和地形可形成遮挡。植物必须在设定中启用“Affect Distance Field Lighting”。其他物体仍可接受遮挡。

设置过程

生成的距离场分辨率默认较低,可导致光斑的出现。可提高静态网格体上的 Distance Field Resolution Scale 进行补偿。

结果

弥散遮蔽

距离场环境遮蔽生成一个环境法线(最少遮挡的方向),用于结合遮蔽因子修改天空光照弥散计算。

No Distance Field Ambient Occlusion

Distance Field Ambient Occlusion

正午的 Fortnite 关卡。在 Fortnite 中,玩家可以随时推倒任何墙壁、地板或天花板并重新建造,因此光照必须随之进行更新。距离场环境遮蔽支持这些变化。

Video of interaction with objects in the level editor, with Distance Field AO updating in realtime.

镜面遮蔽

距离场环境遮蔽在天空光照上形成近似镜面的遮蔽。定向遮蔽锥形和反射锥形(尺寸取决于材质的粗糙度)相交即可进行计算。

images/0Original.jpg

images/0SpecularOcclusion.jpg

管道上的镜面遮蔽。

植物遮蔽

尽管距离场遮蔽在表面上进行,但其仍可对诸多小叶片组成的片状植物进行处理。在植物网格体上启用 Generate Distance Field As If Two Sided 将柔化计算的遮挡,可获得最佳效果。天空光照上的 Min Occlusion 可有效防止内部完全变黑。

Screen Space Ambient Occlusion only

Distance Field Ambient Occlusion on foliage

三角网格体在距离场中缩小时,带 LOD(细节模型级别)的植物和距离场环境遮挡之间可能出现问题,产生过度遮挡。出现此问题的原因是距离场在一段距离中仍然准确,但三角网格体却不准确。

在这些 LOD 上使用使用 World Position Offset,将顶点拉出距离场即可解决此问题。对摄像机的小偏移也有效。对布告板而言,使用新的 Pixel Depth Offset 功能创建可更好地展示原始 3D 三角网格体的有效深度值。

No Pixel Depth Offset

Pixel Depth Offset

距离树布告板显示天空光照过度遮挡,利用 Pixel Depth Offset 进行了改善。

它的工作原理是什么?

此技术中使用的距离场是代表网格体表面的有向距离场。有向距离场在每个点保存到最近表面的距离。网格体中的点保存为负的距离。

images/DistanceField.jpg

距离场首个实用属性的作用是在追踪光线时安全地跳过空白空间,因为到最近表面的距离已经明确。在区区数步中即可决定相交。对距离场进行光线追踪将生成用于投射阴影的能见度结果。

images/RayTrace.jpg

距离场第二个实用属性的作用是在追踪光线时获得近似的锥形相交(而不产生额外消耗)。对距离场进行光线追踪即可形成非常柔和的区域阴影。该属性是距离场环境遮挡的关键,因为少量的锥形即可为接收器点的整个半球计算出柔和的可见性。

images/ConeTrace.jpg

整个关卡由存储在体积纹理中的范例距离场展示。地形通过高度场单独展示。

Scene View

Mesh Distance Fields View

使用距离场进行灯光设置的延伸阅读。

设置

天空光照

原始组件

网格体构建设置

images/MeshSettings.jpg

限制

技术限制

当前版本的限制(会在之后进行改善)

性能

距离场环境遮挡的消耗主要是 GPU 时间和显示内存。距离场环境遮挡已对此进行优化,可在中配 PC 和 PS4 上运行。其现有消耗更为可靠,因此较为恒定,对物体密度的依赖较小。

使用静态相机和较平表面时,与之前相比新方法快 1.6 倍。在拥有植物和快速移动摄像机的复杂场景中,新方法快 5.5 倍。PS4 完整游戏场景的距离场环境遮挡消耗为 3.7ms。

之前的方法进行了自适应抽样,因此平坦表面进行的运算较少,但也引起干净环境中出现许多斑点。

Old Method - Adaptive

New Method - Smooth

环境遮挡当前的计算速度足以消除自适应抽样,因此遮挡更为流畅。

Old Method - Adaptive

New Method - Smooth

由此可以了解,新方法需要较长的历史过滤,可能出现重影(尤其是阴影投射物被移除后)。我们将争取在之后对此进行改善。

技术细节

主要利用跟随摄像机的全局距离场进行优化。它的创建方法为:将所有常规单个物体距离场合成为一些集中围绕摄像机的体积纹理(称之为裁剪图)。只有新的可见区域和受场景修改影响的区域需要更新,因此合成消耗并不大。

裁剪图纹素尺寸的示例图 - 每个裁剪图颜色均不相同。

DF_ClipMap.png

全局距离场的分辨率比物体距离场低,因此无法用于所有物体。为天空遮挡计算锥形追踪时,物体距离场在被着色点附近被取样,而更快速的全局物体距离场被取样的位置更远。

以下是全局距离场和物体距离场光线追踪的对比示例图。全局距离场中的表面布满斑点,较薄的物体将消失。

DF_GlobalDF.png

疑难排解和精度

精度的主要因素是有效的距离场分辨率。可通过 DistanceFieldResolutionScale 进行修改。关卡中网格体尺寸相近,精度越高,因为较大的网格体容易出现较多错误。在 Fortnite 中,网格体顺应一个网格,或是四处放置的道具,借此可以达到最佳效果。对地形进行单独处理,不受距离场分辨率影响。

images/VisualizeMeshDistanceFields.jpg
一个关卡中网格体距离场的示例图

images/Mesh.jpg
原始网格体

images/LowResDistanceField.jpg
距离场分辨率过低,重要功能缺失,环境遮挡将出现穿帮

images/HighResDistanceField.jpg
DistanceFieldResolutionScale 被设为 3,重要功能已展示

简易反射光照

在天空光照上取消勾选“Lower Hemisphere Is Black”并在立方体贴图上绘制一些底色,即可获得与太阳反射光照相似的效果而无需额外消耗。这将使灯光泄露到室内,因其并不遵循定向光源的投影,在室外场景中较为有效。