UE4 Lighting系列1

光照基础

UE4中的所有光源都是通过lightmass和直接照明两种方式作用于物体。同时灯光分直接光和间接光。

各种灯光的Movable和Stationary类型都会对物体产生直接光照明。所有Static类型灯光,自发光材质物体以及Stationary经过lightmass后会对物体产生间接光照明。反射也是一种间接光照明(动态天光产生的天光反射属于直接光)。

如果场景中拥有这两种光照类型,那么我们就说这是全局光照。在默认情况下,光源都是设置为全局光照。

虚幻引擎的间接光照是通过lightmass生成lightmap来完成的

1.1 Direct Light

直接从光源所在处打出射线进行计算,对于有光源半径的光而言会多做一些计算。

直接光都是动态光,可以实时变化颜色,亮度等等

1.2 Indiret Light

间接光照的计算核心是光子映射算法. 所有的间接光都是静态光,但我们仍然可以通过后期以及材质来模拟的实时调整间接光的颜色和亮度。

1.2.1Lightmass

Lightmap为HDR,存有灯光方向信息。UE4使用Lightmass对光照进行预计算,以节省动态光照计算的成本。Stationary light build完灯光后还有Shadowmap,如果有Stationary天光会有sky occlusion map(Bent normal信息)。

材质,物体,灯光,后期都可以控制Lightmass。

1.2.1.1Lightmass的设置

最主要的两个参数:

Static Lighting Level Scale

Indirect Lighting Quality

对时间的影响

Lightmass portal提高lightmap的品质

Light Scenarios提供静态光变化的可能性

1.2.1.2光照贴图需要注意以下问题:
  • 不要有重叠的部分

  • 不要超过0~1的UV空间

  • Flag-Mapping并不是最好的方式且经常导致光照贴图错误

  • 尽量占满UV空间

  • 如果模型很大而且复杂,最后分成数个物体,这样也能有助于裁剪等机制

  • 尽量减小光照贴图分辨率以减少贴图尺寸

  • 相互不接触的线之间要保持至少2像素的距离,以防止光照污染

    展UV的时候注意Min Lightmap resolution, 定义了UV块之间的距离。这个值要小于等于lightmap resolution,否则会出现lightmap像素无法匹配而溢出的问题。

1.2.2ILC (indirect light cache间接光缓存)

ILC是对动态物体进行间接光的

球形谐波是一种非直射光cache的编码方式,也可以理解为如何把一张图片IBL编码到一个球体上的方式来表现这个位置光线的方向,强度,遮挡等信息。可以理解成一个非常低分辨率的cubemap(2*2像素每个面);编码的频率多少决定精度的高低, band的数量高低可以理解成LOD的概念,低级别的band可以表达大致的信息,但缺少细节,高级别的band里包含了更细腻的信息。 band的数量越多精度越高。一般游戏里出于实时渲染和内存的考量会使用2 band, 3band 一般使用于high end的渲染,比如Wetadigital在他们的电影渲染流程里应用的那样。 Cache的点的密度在电影渲染里会非常高,当然UE4里也是可以调节cache密度来符合不同性能和品质的要求

1.2.3VLM(Volumetric ligthmap)

ILC也是对动态物体进行间接光的

ILC VS VLM

最主要的差别是VLM为逐像素插值(GPU),而ILC为逐物体(CPU)。像素级别插值带来的是更加细腻的光影过度,减少动态物体运动时间接光的突然变化;另外也为照亮Volumetric fog带来可能性.

1.2.4反射

反射其实也是一种间接光,会在最后影响

1.3 阴影

阴影分直接光阴影和间接光阴影;还有各种屏幕空间以及基于材质自身空间的阴影作为补充。直接光阴影必须有直接光存在。它们通常都是动态阴影,间接光阴影必须有间接光存在。它们可以是烘培后的静态阴影贴图;也可以是由 ILC/VLM 动态的阴影。

就是物体接合处的光照效果不真实的问题,这个问题通常是由间接光照引起的,因为间接光照计算时各个物体相互之间是独立的,因此计算的结果就会不合理。

官方的建议之一是调整世界设置中的静态光照参数

Indirect Lighting Quality设置到2或者更高

Indirect Lighting Smoothness设置到0.65~0.75之间

Static Lighting Level Scale这个属性由于是对计算单位进行缩放,虽然调小会有更好的阴影过度,但是会明显的提高光照计算量。通常应用于建筑展示领域,不建议在游戏开发中使用。

通常上面的调整效果是有限的,其实这个问题更多的应该从关卡构建上入手:

  1. HDR LDR

    1. Ss

二.光源类型

UE4的光源类型主要分为:Static(静态) 、 Stationary(固定) 和 Mobile(移动),不同的设置在光照效果上有着显著的区别,以及性能上也各有差异。

2.1 Static光源**(静态):**

UE4的静态光照是在光照构建(build)中进行预计算的部分,会对预计算的光照结果进行存储,例如光照贴图(LightMap,将在之后讲解)、阴影贴图这样的形式,可以在运行时支付较低的效率而获得较好的光照结果。它在运行时完全无法更改或移动的光源。这些光源仅在光照贴图中计算,一旦处理完,对性能没有进一步影响。可移动对象不能与静态光源集成,因此静态光源的用途是有限的。

它可以在World Setting里进行进行关闭。

静态光照不能让移动(动态)的对象产生阴影。但是,如果照明的对象也是静态的,就能够产生面积(接触)阴影。这是通过调整 源半径(Source Radius) 属性实现的。但是,应当注意的是,获得柔和阴影的表面很可能必须设置相应的光照贴图分辨率以便阴影呈现较好的效果。

静态光源的主要应用对象是移动平台上的低性能设备。

2.1.1 Static光源的阴影

Static光源的阴影是能用与Static物体,存储在lightmass中,这意味着它们对动态对象不会产生 直接影响(静态光照由于烘焙到了间接光照缓存中,所以会有一些影响)。在编辑一个固定光源或者静态光源时,光照信息会变成未构建状态,预览阴影能够为您提供一个在光照构建后阴影的大致样子。

2.1.2 Static光源的特性

  1. 采用全局光照时,所有具有静态移动性的光源在默认情况下都是区域光源。点光源和聚光灯光源使用的形状是一个球体,其半径是由全局光照设置(Lightmass Settings)下的光源半径(Light Source Radius)设置的。定向光源使用一个圆盘,位于场景的边缘。光源的大小是控制阴影柔度的两个因素之一,因为较大的光源会产生较柔和的阴影。另一个因素是从接收位置到阴影投射物的距离。随着距离的增加,阴影变得柔和,就像在现实生活中一样

2.2 Stationary光源**(固定):**

固定光源(Stationary Lights) 是保持固定位置不变的光源,但你可以改变光源的亮度和颜色等。这是与静态光源的主要不同之处,静态光源在gameplay期间不会改变。但是,如果在运行时更改亮度,请注意它仅影响直接光照。间接(反射)光照不会改变,因为它是在光照系统(Lightmass)中预先计算的。所有间接光照和来自固定光源的阴影都存储在光照贴图中。直接阴影存储在阴影贴图中。这些光源使用距离场阴影,这意味着,即使有光照对象上的光照贴图分辨率相当低,它们的阴影也将保持清晰。

Stationary Light在同一个被覆盖区域中只能有4个,当超过这个数目时,范围最小的那个Stationary Light会被转化为动态光源。

2.2.1 Stationary光源的阴影

Stationary光源在不透明表面的静态阴影:

Lightmass 在重新构建光照过程中为Static对象上的Stationary光源生成距离场阴影贴图(Distance Field Shadowmap)。特点是能使用非常低的分辨率但是可以生成非常锐利的边缘。和光照贴图类似,距离场阴影贴图要求所有StaticMesh具有唯一的展开的 UV。必须构建光照才能显示距离场阴影,否则在预览时将会使用动态阴影。最多只能有 4 个重叠的Stationary光源具有静态阴影。

它可以和动态的物体有很好的交互,并且如果和动态的阴影结合也不会产生混合。

距离场阴影的原理是使用到最近阴影过渡的距离代替标准的阴影因数存储(0 代表阴影,1 代表没有阴影)。然后为了在运行时重新构建阴影,只要简单地缩放或偏移到想得到的半影尺寸的距离即可。这样最大的好处是如果分辨率降低,阴影过渡可以随着距离场更温和地下降。当直接地存储阴影因数时,降低分辨率将会导致斑驳和锯齿阴影。当在使用距离场阴影时,降低分辨率,阴影的过渡仍然是同样的尖锐度,但是在阴影过渡的角落或高频率拐角处会变得更加弯曲。

Stationary光源在透明表面的静态阴影:

半透明表面也能够在开销较小的情况下接受Stationary光源的阴影投射—— Lightmass 会根据场景静态物体预计算阴影深度贴图,这将在运行时被应用到半透明表面。这种形式的阴影是比较粗糙的,仅仅在米的度量单位上计算阴影

Stationary光源动态阴影:

每个可移动的对象从固定光源创建两个动态阴影:一个用于处理静态环境世界投射到该对象上的阴影,一个处理该对象投射到环境世界中的阴影。通过使用这种设置,固定光源唯一的阴影消耗就来源于它所影响的动态对象。这意味着,根据所具有的动态对象的数量不同,该性能消耗可能很小,也可能很大。如果足够多的动态对象,那么使用可移动光源会更加高效。

Stationary可用于为场景中的动态对象投射动态级联阴影贴图(CSM)。使用CSM阴影时,动态对象上的阴影将与场景中静态对象投射的预计算的阴影正确混合。

Stationary光源的软阴影

Stationary的直射光源提供了一个新的阴影选项,在 Lightmass 区块内,叫 Use Area Shadows for Stationary Lights。

如果想使用Stationary光源的区域阴影选项,先选择场景中的直射光源并确认它的移动性(Mobility) 设置为 固定(Stationary)。然后在该定向光源属性的 Lightmass 区域中,勾选 Use Area Shadows for Stationary Lights 选项。当该选项被勾选时,该固定光源将会使用区域阴影来做与计算阴影贴图。区域阴影能在光照投影较远处产生柔和的阴影边界。

它会产生一个单独的shadow map

2.2.2 Stationary光源的特性

  1. 环境法线天空遮挡:当启用具有固定的天空光照(Sky Light)时,全局光照以环境法线的形式产生定向遮挡。

  2. 距离场阴影贴图:全局光照计算固定光源(Stationary Lights) 的距离场阴影贴图。距离场阴影贴图即使在较低的分辨率下也能很好地保持其曲线形状;然而,它们不支持区域阴影或半透明阴影。

Mobile光源**(移动):**

可移动光源 将投射完全动态的光照和阴影,可修改位置、旋转、颜色、亮度、衰减、半径等所有属性。其产生的光照不会被烘焙到光照贴图中,但是其也无法产生间接光照

2.3.1 Mobile光源的阴影

如果我们使用的Mobile光源,或者使用的其他光源但是没有build,那么我们在编辑器里看到的阴影,全是实时阴影。实时阴影需要每一帧都进行计算,所以会有较大的性能消耗。渲染一个有阴影的完全动态的光源所带来的性能消耗,通常是渲染一个没有阴影的动态光源的性能消耗的 20 倍。

CSM:

主要是direct light 生成。多层级的,兼顾性能,跟面积,面数有关。根据美术的需要,如果物体很小,直接忽略不产生shadow。由于涵盖的面积越大,贴图最终的精度越低,可以使用Far csm

这些属性都是决定动态光照级联切换的,在显示中打开

Dyamic Shadow Distance为光照的覆盖的范围,设置为0的话等于禁用这个光照。Stational光照的默认设定为0,也就是不开启动态光照。

Num Dynamic Shadow Cascades为动态贴图的过渡级别,越多的话动态光照的效果就越好,但是也更消耗性能,设置为0的话等同于禁用动态光照。

CSM调整

动态光照的污染等问题,通常通过调整CSM的属性来进行排查。

官方的示例中是通过调整Cascade Distribution Exponent来解决问题的,但是由于室外场景比较多变,并没有

统一的解决方案,通过Shadow Frustrums工具的配合,对上面的几个属性进行调整比较好。

三 阴影

名称 静态(Y)/动态(N) 假阴影 直接光遮蔽 间接光遮蔽 静态物体能使用 动态物体能使用 Skeletal mesh不能使用的阴影 特定
烘培到lightmap的阴影部分 Y N Y Y Y N N /
CSM N N Y N Y Y N Directional light投射
Per-object shadow N N Y N N N N /
Capsule shadow N N Y Y N only for skeletal mesh N 只能由Directional light投射
Distance field shadow N N Y N Y Y Y /
Modulate shadow N N Y N N N /
DFAO N N N Y Y Y Y /
SSAO / Y N Y Y Y N /
Contact Shadow / Y Y N Y Y N /
Preshadows Y N Y N /

Precomputed Light Volume

这个主要是在场景中生成预计算的间接光照缓存点,这样动态的物体就可以从中取得数据并插值得到自己的间接光照。

插值的方式中,ILCQ Point是根据物体当前的位置进行的,所以如果物体有一定的大小且移动速度较慢的话,就容易产生可见的阴影跳变。相对的ILCQ Volume由于使用多个点进行插值处理,运算成本会变高,尤其是对于非常大的物体。

Single Light shadow

Mesh Distance Field

在mesh中设置,并且有分辨率

Distance Field AO

在天光中设置

Distance Field Direct shadow

光线追踪

Capule Direct shadow

世界对于角色的阴影

Per-object shadow

主要是对动态物体的,可以用于粒子,有最大最小分辨率

Contact Shadow

后期的shadow,如果比较小,或者没有几何信息的面片。可以通过高度图修改Depth

04.png

强度的单位