00 前言

关键词

  • Static Lights 静态光照
  • Dynamic lights 动态光照

看完本篇内容你将对以下概念心中有数:

  1. 什么是静态光照,什么是动态光照
  2. 光源的移动性是什么意思,为什么区分出 Static(静态)、Stationary(固定)、Movable(可移动)
  3. 光照系统下的性能优化



01 静态光照

首先说明的是,光照在渲染中和反射一样是很昂贵的,光照不是只是指把对象照亮,而是呈现出物体间的错综复杂的阴影关系,对于所有渲染引擎来说,都是能先预计算就预计算,尽可能减少真正在实时部分的计算。


静态光照是指需要在程序运行前进行构建,且在运行时不会发生任何位置、强度、色彩等改变的光照。直观来说,它就是在运行时静态的光源,比如稳定输出光的白炽灯,而不是忽明忽暗的火苗。

在静态光照的实现中,会进行预计算把光照结果存储在光照贴图中,最终被烘焙进纹理里。从这个意义上来说,我们看到的一切都不是真正的光照,而是把光照结果贴进一个个对象切面的障眼法。


我们参考下图的过程,

一个立方体受到两束光(图一),预计算会生成光照贴图(图二),在后续过程中将光照贴图和纹理(图三)混合,最后得到带有光照效果的画面。


UE 实现了一套独立的 LightMass 系统用来处理整个光照贴图的生成过程,其中涉及到漫反射、高光反射、遮挡等复杂的问题。LightMass 中会缓存整个体积空间的间接光信息,通过在体积内建立一个个密集的小点,缓存下在每个点上的间接光信息,最终的光照贴图计算出来可以有丰富的层次。

ILC 缓存采集密度在 World Settings 下的 Volume Light Sample Placement 可以设置。


静态光照的优势是性能快,因为复杂的光照计算都在开发环境构建好了;同时它带来的问题是很占内存,本质上它就是一张纹理,这也意味着它的分辨率是有上限的,如果是巨型模型很容易缺乏足够的光照贴图UV空间,最终该模型的光照效果很粗糙。

如果对默认的呈现想要调节参数,可以在后期体积/PostProcessVolume中找到 Light Propagation Volume这块,还有每个 actor 下找到 LightMass 也有更针对配置 。


我们可以在 World Settings 中查看生成了多少光照贴图,不过我们不能改动。


02 动态光照

了解了静态光照我们就可以想到,动态光照有如它的名字一样,光源会被改变、被移动、被显示和隐藏,所以这类光源没有办法像静态光照一样预先计算好,而是要采用 GBuffer 图像来实时计算光照混合。


以一个单一光源的简化案例来窥探动态光照的计算过程,

首先需要深度通道,即摄像机到每个几何体的距离,混合上光照的色彩和强度;

然后混合法向量图像;

最后混合上阴影图像。


对于动态光照来说,侠义上的光照本身的性能损耗还挺低的,上图的最后一步的阴影计算才是性能损耗的大头,阴影的计算在像素着色器上要复杂的多,这也意味着,屏幕中占比越大的动态光照阴影,性能损耗就越大。


由于动态光照的复杂性,针对不同的场景 UE 提供了不同的工具来实现动态光照的阴影,包括

  1. Regular Dynamic Shadow 常规动态阴影
  2. Per Object Shadows 逐对象阴影/固定光源阴影
  3. Cascaded Shadow Maps(CSM) 级联阴影地图
  4. Distance Field Shadows 距离场阴影
  5. Inset Shadows 插图阴影
  6. Contact Shadows 接触阴影
  7. Cupsule Shadows 胶囊体阴影

Regular Dynamic Shadow 常规动态阴影

光源移动性设为 Movable 时默认采用,它的特点是阴影非常清晰锐利、没有反射光照、没有辐射/全局光照等效果,显得很“硬”。当然通常在最终呈现里,由于其他静态光源的存在,会和光照贴图混合最终成像稍软化一些。


Per Object Shadows 逐对象阴影/固定光源阴影

光源移动性设为 Stationary 时默认采用,它的特点时阴影丰富柔和、有反射光照、有辐射/全局光照等效果,技术上混合使用了光照贴图的静态光照和动态光照。可以说在三种光源移动性中,固定光源拥有最高品质、中等可变性和中等性能成本。


Cascaded Shadow Maps(CSM) 级联阴影地图

实现将视锥划分成一系列基于距离的阴影级联,当离摄像机越远,每个级联的分辨率就越低。 这意味着,距离玩家视野最近的阴影分辨率最高,而距离最远的阴影分辨率最低。 超出 动态阴影距离(Dynamic Shadow Distance) 后,系统将重新采用静态烘焙阴影,通过这种方式,呈现出阴影淡入淡出平滑过度的效果。

仅适用于 定向光源/DirectionalLight 且设为 固定光源 的情况 ,但注意不适合用在特别开阔的大场景下。

设置和调节操作见 使用级联阴影


观察下图1为静态光照,图2为配置 CSM


Distance Field Shadows 距离场阴影

特别适合不需要太精准的长距离阴影,高性能、低效果。适用于远处的阴影,比如一条很开阔很长的马路上的远方阴影。

默认是关闭的,在 Project Settings > Generate Mesh Distance Field勾选开启。再在需要设置该效果的光源 Details 面板下配置Distance Field Shadows相关参数。


Inset Shadows 插图阴影

Per Object Shadows 逐对象阴影/固定光源阴影 是一回事


Contact Shadows 接触阴影

适合细微细节的阴影,用来精细化特定模型的阴影。

同样的石面,左侧未开启接触阴影,右侧开启接触阴影


Cupsule Shadows 胶囊体阴影

简单粗粒度、损耗很低的阴影体效果,用对象的胶囊体计算阴影而不是对象自身的面。



03 光源移动性

基于上面关于静态光照和动态光照的内容,我们再来理解 UE 提供的移动性就清楚多了。

静止的光源表示完全采用静态光照,要求是光源不能在运行时发生任何变化,性能最佳,效果中等;

固定的光源表示采用静态光照和动态光照的混合,要求是光源在运行时位置不能发生变化,性能中等,效果最佳;

移动的光源表示主要采用动态光照,光源可以任意移动和改变,性能最低,效果最低。


在以上的原则下,UE 提供了 级联阴影地图、距离场阴影、接触阴影、胶囊体阴影的手段给开发者去针对性提升效果和降低损耗。



04 优化指南

  1. 为关卡添加 LightmassImportanceVolume ,告知必要的光照计算范围,减少全场景 LightMass 计算的浪费。
  1. 检查静态光照贴图的分辨率,不重要的地方应该减少分辨率,重要的地方适度提高。
    1. 位于 视图模式(View Modes)> 优化视图模式(Optimization Viewmodes) > 光照贴图强度(Lightmap Density)
    2. 格子越大分辨率越低,避免非必要对象出现红色,比如很远的地方却用很高的分辨率的光照贴图,以绿色及以下性能为佳
  1. 合理优化缩小光源的影响范围
    1. 下面这个例子 左边 和 右边 呈现的效果是一样的,但它们实际的影响范围和衰减半径不同。在这个例子中,左边 的光源要消耗性能更多,最佳实践是永远不要为看不见的效果付出代价。
  1. 结合不同的手段开启或关闭、参数的配置达成性价比更高的光照阴影,包括但不限于 级联阴影地图、距离场阴影、插图阴影、接触阴影、胶囊体阴影
    1. 多尝试多测试,抓大放小,不需要的内容关闭阴影
    2. 这几项手段的细节见前文 静态光照 和 动态光照
  2. 关注大型对象的面数和光照贴图分辨率,防止光照贴图空间不足,有需要适当拆解大对象或采用胶囊体阴影

100 相关资料