Choose your operating system:
Windows
macOS
Linux
可移动光源产生的阴影是使用每个刚性网格体的对象距离场,计算来自动态光源的有效区域阴影而得出的。在虚幻引擎4(UE4)中,有一个 距离场阴影 (DFS)。为了计算阴影,从要着色点朝着每个光源,通过有向距离场(SDF)跟踪光线。 使用到遮挡物的最近距离估算椎体追踪,所耗成本与光线追踪相同。它让球形光源形状能 实现高质量区域阴影。
场景设置
该功能要求你在 项目设置(Project Settings) 的 渲染(Rendering) 分段中启用 生成网格体距离场(Generate Mesh Distance Fields) 。有关更多信息,请参阅 网格体距离场 页面。
要启用距离场阴影,首先将 光源(Light) 拖到场景中,将其"移动性"(Mobility)设置为 可移动(Movable) ,然后在光源的 细节(Details) 面板中 启用 距离场阴影 。
有关逐步介绍指南,请访问 使用距离场阴影 使用指南,以了解更多信息。
区域阴影设置
每个光源类型都可以使用距离场阴影来创建柔和区域阴影。这些阴影模拟真实世界的阴影,在接近于基部的地方保留明显的接触阴影, 随着距离的增加,柔化处理延伸阴影
有关光源设置的更多信息以及更多示例,请参阅 网格体距离场参考 页面。
点光源和聚光源半径
对于点光源和聚光源,使用 源半径(Source Radius) 来确定一个光源上的阴影半影范围。区域阴影使用清晰接触阴影计算, 接触阴影随着距离的延长而变得柔和。在点光源和聚光源上,表示为黄色球体。
光源半径不应与场景相交,否则会导致照明瑕疵。
距离场阴影来自于一个点光源,该光源使用光源半径 柔化门道、长椅和钢琴对周围几何体产生的阴影投射。
有关点光源和聚光源设置的更多信息,请参阅 网格体距离场参考 页面。
定向光源角度
对于定向光源,使用 光源角度(Light Source Angle) 来确定一个光源上的阴影半影范围。距离场阴影几乎没有 自交问题,因此能避免远处漏光和过度偏差问题,而传统阴影映射则很难避免。
在大多数情况下,使用级联阴影贴图(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) 。
点击查看大图。
如果看到较白而不是较灰的区域,意味着需要通过多个步骤才能找到网格体表面的交点。与相对简单的网格体相比,掠射角光线需要更多的步骤才能和平面相交。
网格体距离场质量
距离场阴影保真度对阴影准确度有非常大的影响,超过了 距离场环境光遮蔽 。 增大的网格体距离场分辨率将提高静态网格体的阴影投射。使用网格体距离场可视化可以检查质量。
启用距离场阴影的场景视图 |
网格体距离场可视化 |
网格体距离场阴影通过深度感知放大采样以半分辨率进行计算。 临时抗锯齿(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位浮点格式保存距离场体积纹理。它占用的内存量仅为之前的一半,却可以减少较大或较薄网格体中的某些瑕疵。
-
-
全局距离场主要缓存移动性设置为静态或固定的静态图元。整个全局距离场主要继承了静态缓存,因此当修改可移动图元时,只需要将附近的其他可移动图元重新合成到全局距离场中。
局限性
距离场阴影与网格体距离场方法有着一样的常规限制。有关这些限制的更多信息, 请参阅 网格体距离场 页面。