距离场柔和阴影

关于使用网格体距离场创建动态柔和区域阴影的概述。

Windows
MacOS
Linux

可移动光源产生的阴影是使用每个刚性网格体的对象距离场,计算来自动态光源的有效区域阴影而得出的。在虚幻引擎4(UE4)中,有一个 距离场阴影(DFS)。为了计算阴影,从要计算阴影的点朝着每个光源,通过有向距离场(SDF)跟踪光线。 使用到遮挡物的最近距离估算椎体追踪,所耗成本与光线追踪相同。它让球形光源形状能 实现高质量区域阴影。

场景设置

该功能要求你在 项目设置(Project Settings)渲染(Rendering) 部分中启用 生成网格体距离场(Generate Mesh Distance Fields)。有关更多信息,请参阅网格体距离场 页面。

要启用距离场阴影,首先将 光源 拖到场景中,将其"移动性"(Mobility)设置为 可移动(Movable),然后从光源的 细节(Details) 面板, 启用 距离场阴影

DirectionalLightDFSettings1.png

有关逐步介绍指南,请访问使用距离场阴影 操作指南,以了解更多信息。

区域阴影设置

每个光源类型都可以使用距离场阴影来创建柔和区域阴影。这些阴影模拟真实世界的阴影,在接近于基部的地方保留明显的接触阴影, 随着距离的增加,柔化处理延伸阴影

传统阴影贴图

距离场阴影

有关光源设置的更多信息以及更多示例,请参阅网格体距离场参考 页面。

点光源和聚光源半径

对于点光源和聚光源,使用 源半径(Source Radius) 来确定一个光源上的阴影半影范围。区域阴影使用清晰接触阴影计算, 接触阴影随着距离的延长而变的柔和。在点光源和聚光源上,表示为黄色球体。

LightSourceVis.jpg

编辑器用黄色线条绘制光源形状。

光源半径不应与场景相交,否则会导致照明瑕疵。

光源半径:| 0

光源半径:| 50

距离场阴影来自于一个点光源,该光源使用光源半径 柔化门道、长椅和钢琴对周围几何体产生的阴影投射。

演示:点光源在场景中移动,从各个阴影投射网格体投射区域阴影。

有关点光源和聚光源设置的更多信息,请参阅网格体距离场参考 页面。

定向光源角度

对于定向光源,使用 光源角度(Light Source Angle) 来确定一个光源上的阴影半影范围。距离场阴影几乎没有 自交问题,因此能避免远处漏光和过度偏差问题,而传统阴影映射则很难避免。

光源角度:| 1

光源角度:| 3

距离场阴影来自定向光源,为了实现更柔和阴影调整了其光源角度。

在大多数情况下,使用级联阴影贴图(CSM)提供定向光源的动态阴影。这要求将场景中的网格体渲染到 多个级联阴影贴图中(用于实现阴影的细节层次)。阴影计算成本随着阴影距离增大而增加,因为 要渲染到阴影贴图中的网格体和三角形数量较多。

距离场阴影在远处的性能更优异,它只针对可见像素完成阴影工作。级联阴影贴图可以用于对摄像机附近的区域计算阴影, 而RTDF阴影对更远的区域计算阴影,最远达到设置的 距离场阴影距离(Distance Field Shadow Distance)

仅级联阴影贴图

级联阴影贴图和距离场阴影

启用距离场阴影后,超过 级联阴影贴图距离(Cascaded Shadow Map Distance) 设置值的区域将使用 距离场计算阴影。在使用CSM和RTDF阴影的对比中,CSM阴影设置为1,000 CM(厘米),允许在 摄像机附近呈现清晰的阴影,并添加大量细节。在超过1,000 CM的阴影距离处,使用RTDF阴影,允许对 最远不超过1.2 KM(千米)的对象计算阴影。这样,远处的树木也可以投射阴影,而如果使用级联阴影贴图,则需要极高的计算成本。

演示:定向光源使用距离场阴影在一天内随时间变化的效果。

有关定向光源设置的更多信息,请参阅网格体距离场参考 页面。

场景表达

每个创建的关卡都由所放置Actor的所有这些网格体距离场组成。网格体距离场是离线生成的,使用了将效果保存在体积纹理中的三角形光线追踪。因此,网格体距离场是无法在运行时生成的。这种方法会计算所有方向上的有向距离场,找到距离最近的表面,然后将该信息保存起来。

你可以使用视口将表达场景的网格体距离场可视化,只需依次选择 显示(Show) > 可视化(Visualize) > 网格体距离场(Mesh Distance Fields)

启用可视化的菜单

网格体距离场可视化

点击查看大图。

如果看到较白而不是较灰的区域,意味着需要通过多个步骤才能找到网格体表面的交点。与相对简单的网格体相比,掠射角光线需要更多的步骤才能和平面相交。

网格体距离场质量

距离场阴影保真度对阴影准确度有非常大的影响,超过了距离场环境光遮蔽 。 增大的网格体距离场分辨率将提高静态网格体的阴影投射。使用网格体距离场可视化可以检查质量。

距离场分辨率:| 1

距离场分辨率:| 5

距离场分辨率:| 1

距离场分辨率:| 5

启用距离场阴影的场景视图

网格体距离场可视化

网格体距离场阴影通过深度感知放大采样以半分辨率进行计算。临时抗锯齿(Temporal Anti-Aliasing)(TAA)非常有助于降低使用半分辨率时 可能出现的闪烁现象,但有时仍可能会出现锯齿边缘。

有关网格体距离场质量的更多信息,请参阅网格体距离场 页面。

性能

以下GPU时间是在Radeon 7870、分辨率1920x1080、完整游戏场景中测得的:

测试

级联/立方体贴图阴影成本(毫秒)

距离场阴影成本(毫秒)

提速百分比(%)

定向光源,距离10k个单位,3个级联阴影贴图

3.1

2.3

25%

定向光源,距离30k个单位,6个级联阴影贴图

4.9

2.8

43%

1个点光源,大半径

1.8

1.3

30%

5个点光源,小半径

3.2

1.8

45%

优化

下面是优化距离场阴影时可以使用或应该考虑的要点:

  • 在定向光源上,光源角度(Light Source Angle) 越大,成本越高,因为每个要计算阴影的点都需要考虑更多的对象。

  • 距离场阴影距离(Distance Field Shadow Distance) 的值越大,剔除效率越低。

  • 启用了 双面距离场生成(Two-Sided Distance Field Generation)(在 构建设置(Build Settings) 中启用)的网格体的阴影需要耗用更多成本,因为产生的阴影永远不会完全不透明。

在虚幻引擎4.16中,可以启用以下优化:

  • 项目设置(Project Settings) > 渲染(Rendering) 中启用已选选项。

    点击查看大图。

    • 压缩网格体距离场(Compress Mesh Distance Fields) 启用后,可以保存在内存中压缩的距离场体积纹理。这会减少距离场占用的内存量,但如果使用关卡流送,当流送切入这些关卡时,会在游戏中造成卡顿。

    • 八位网格体距离场(Eight Bit Mesh Distance Fields) 启用后,能够以8位定点格式代替默认的16位 浮点格式保存"距离场"体积纹理。它占用的内存量仅为之前的一半,却可以减少较大或较薄网格体中的某些失真。

  • 全局距离场主要缓存移动性设置为静态或固定的静态图元。整个全局距离场主要继承了静态缓存,因此当修改可移动图元时,只需要将附近的其他可移动图元重新合成到全局距离场中。

局限性

距离场阴影与网格体距离场方法有着一样的常规限制。有关这些限制的更多信息, 请参阅网格体距离场 页面。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback