【ue4】【使用】光照系统_基础

前言

个人感觉 ue4 的光照系统特别复杂

她把光源按照移动性分为了三类 -- 静态, 固定, 动态

的同时, 也把物体按照移动性分为了相同的三类

这样总的来说就有了9种对应关系

而对于每一种, 不同的光源类型还可能有不同的方案, 如平行光和点光源的方案就有差异

这样算下来情形就有些复杂了

我们只能慢慢地, 一点一点地去实践分析, 再找几个大腿, 踩踩前人的脚步, 实现不行还有源码 ~

移动性 mobility

光源的移动性决定其影响物体所使用的方式, 而物体本身也有三种移动性属性可以选择(烦)

静态光源 static light

在运行时不会以任何方式改变或移动

光的位置 -- 不能变

光的颜色 -- 不能变

光的强度 -- 不能变

光的其他属性 -- 也不能变

静态光源只在光照贴图 (lightmap) 中进行计算, 即预处理 (烘焙) 出所有的光照和阴影

直接光照 -- 无

间接光照 -- lightmap -- 静态光照

直接阴影 -- 无

间接阴影 -- lightmap -- 静态阴影 -- shadow on lightmap

静态光源也可以使用 区域阴影 (area shadow)

这个区域阴影的柔和程度是受 光源半径 (light source radius)光照贴图分辨率 (lightmap resolution) 影响的

下面是分别设置光源半径为 50 和 400 的区别, 可以看到 400 的比 50 的要温柔多了

至于光照贴图分辨率, 顾名思义一下也知道是用来控制烘焙出的光照信息的细节程度的

我们可以在 静态物体 (SM, static mesh) 的 Override Lightmap Res 选项来设置, 数值越大分辨率越高

我们也可以在 BSP 表面属性的 Lightmap Resolution 属性来设置, 此处数值越大分辨率越低 (密度属性)

固定光源 stationary light

在运行时位置保持固定, 但其他方面的属性如亮度和颜色可以修改

但是在运行时对亮度进行修改, 只会影响直接光照 -- 间接光照是烘焙出来的, 所以不会变

光的位置 -- 不能变

光的颜色 -- 能变

光的强度 -- 能变

光的其他属性 -- 能变

固定光源的直接光照使用延迟着色直接渲染 -- 这也是运行时可以改光颜色和亮度的原因

其直接阴影是直接投射的动态阴影

而其间接光照存储在 lightmap 中

其间接阴影既有静态的 距离场阴影贴图 (SDFS, single distance field shadowmap), 也可以有动态的 逐对象阴影 (per object shadow) 除此之外还可以使用像静态光源一样的区域阴影, 在这里叫做 shadow factor shadowmap , 属于静态阴影

对于固定或动态物体, 固定光源又可使用 间接光照缓存 (ILC, indirect lighting cache) 或 体积光照贴图 (VLM, volumetric lightmap) 来生成间接光照

直接光照 -- 延迟着色直接渲染 -- 动态光照

间接光照 -- lightmap | ILC | VLM -- 静态光照 & 动态光照

直接阴影 -- SDFS & per object shadow -- 静态阴影 & 动态阴影

间接阴影 -- lightmap -- 静态阴影 -- 像静态光一样的区域阴影 -- shadow factor shadowmap

动态光源 movable light

动态光源的任何属性 (包括位置) 都可以在运行时改变

动态光源不会烘焙到光照贴图中去, 它产生完全动态的光照和阴影

在 Lightmass 的方案中, 动态光源不会产生间接光照 (hehe)

直接光照 -- 动态渲染

间接光照 -- 无

直接阴影 -- 全场景动态阴影

间接阴影 -- 无

动态光源的阴影采用全场景动态阴影, 性能开销比较大

但是对于动态的点光源或聚光源, 又可以使用 阴影贴图缓存 (shadowmap cache) 来优化全场景动态阴影

最后用一张表总结一下以上三种的差异

移动性可变性质量性能消耗用途
静态光源低功率的移动平台
固定光源中高端的移动平台
动态光源高端移动和PC平台

【Tips】 这里说动态光源质量低是在 Lightmass (静态GI) 方案下

ue4 的光源类型

UE4 的光源类型有: 平行光 点光源 聚光源 天光(环境光)

也是比较典型的光源类型, 关于这些光源类型的介绍和相关参数, 可参考此篇

【cg】【原理】光照模型 中的预备知识第二条 光源类型

ue 现在还多了个 矩形光源, 个人感觉然并卵

每一种光源都可以设置它的 Transform 信息 和 移动性类型

【Tips】位置信息对于平行光来说是无效的

定向 (平行) 光源

静态 -- 光照贴图

固定 -- 直接光是动态的, 间接光和阴影是光照贴图

可移动 -- 完全动态的, 无间接光, 全场景动态阴影

属性

平行光的属性大致分为 5 种

光照

绿色的选项都是与阴影相关的 (还挺多的)

英文中文解释
Intensity强度光照的整体强度
Light Color光的颜色光照的颜色
Source Angle角直径人眼看到的光源的直径 (默认为太阳的 0.5357 度)
Affects World影响世界完全禁用光源 (不能在运行时设置) (要想在运行过程中禁用光源的效果, 可以改变它的 Visibility 属性
Indirect Lighting Intensity间接光照强度缩放来自光源的间接光照的量
Atmosphere / Fog Sun Light用作大气中的日光是否使用这个定向光源来定义太阳在天空中的位置
Dynamic Indirect Lighting是否要将该光照注入 LPV (Light Propagation Volume) (动态GI)
Affect Translucent Lighting影响半透明物体的光照该光源是否影响半透明物体
Transmission透射是否开启透射 (需要将光源设置为 movable)

下面是和阴影有关的选项

英文中文解释
Casts Shadows投射阴影光源是否投射阴影
Cast Static Shadows投射静态阴影该光源是否投射静态阴影
Cast Dynamic Shadows投射动态阴影该光源是否投射动态阴影
Cast Translucent Shadows投射半透明阴影该光源是否可以透过半透明物体投射动态阴影
Casts Modulated Shadows投射调制阴影是否投射调制阴影 (只限移动端平台)
Casts Volumetric Shadow投射体积雾阴影是否投射体积雾阴影 (禁用可节约GPU性能)
Shadow Bias阴影偏差控制来自来自这个光源的阴影的精确度
Shadow Filter Sharpen阴影滤镜锐化阴影滤镜锐化该光源的程度
光束

关于光束的概念后面会提到, 现在可以想像一下, 在一个美好的清晨, 一道美丽的曙光照亮了你俊俏的脸庞, 那就是光束了。

英文中文解释
Light Shaft Occlusion启用光束遮挡同屏幕空间之间发生散射的雾和大气是否遮挡该光照
Occlusion Mask Darkness遮挡蒙板的黑度遮挡蒙板的黑度,值为 1 则不会变黑
Occlusion Depth Range遮挡深度范围和相机之间的距离小于这个值的任何物体都将会遮挡光束
Light Shaft Bloom启用光束的光溢出是否渲染这个光源的光束的光溢出效果
Bloom Scale光溢出缩放缩放叠加的光溢出颜色
Bloom Threshold光溢出阈值场景颜色必须大于这个值才能在光束中产生光溢出
Bloom Tint光溢出色调给光束发出的光溢出效果着色所使用的颜色
Light Shaft Override Direction光束方向覆盖可以使得光束从另一个地方发出,而不是从该光源的实际方向发出
Lightmass

英文中文解释
Light Source Angle ?光源角度定向光源的发光表面相对于一个接收者伸展的度数,它可以影响半影大小
Indirect Lighting Saturation间接光照饱和度0 -- 完全去饱和; 1 -- 保持不变
Shadow Exponent阴影指数控制阴影半影的衰减
Use Area Shadows for Stationary Light为固定光源使用区域阴影为固定光源使用区域阴影
光照函数

关于光照函数的事情也会在后面提到

在 ue4 里, 我们同样可以对一个光源使用材质, 来改变它本身的一些特性, 从而产生一些有趣的现象

英文中文解释
Light Function Material光照函数材质应用到这个光源上的光照函数材质
Light Function Scale光照函数缩放比例缩放光照函数投射
Light Function Fade Distance光照函数衰减距离光照函数在该距离处会完全衰减为 Disabled Brightness (禁用的亮度) 中所设置的值
Disabled Brightness禁用的亮度当指定了光照函数但却将其禁用了时,光源应用的亮度因数,参照上面的属性: Light Function Fade Distance
级联阴影贴图 cascade shadow map

前面我们讲固定光源的时候也提到了, 固定光源的阴影方案比较多样且复杂

而级联阴影贴图则是针对于__定向固定光源__ 的一种全景阴影方案

我们也会在后面讲到阴影的时候提到

英文中文解释
Dynamic Shadow Distance MovableLight可移动光源的动态阴影距离从摄像机位置算起,对于可移动灯光而言,级联阴影贴图 生成阴影的距离
Dynamic Shadow Distance StationaryLight固定光源的动态阴影距离从摄像机位置算起,对于可移动灯光而言,级联阴影贴图 生成阴影的距离
Num Dynamic Shadow Cascades为整个场景动态阴影划分视图视锥的级联数量越多阴影分辨率越高, 性能消耗越多
Distribution Exponent分布指数控制级联分布是靠近摄像机(较小的指数),或者离 Camera 较远(较大的指数)
Transition Fraction级联间淡化区域比例级联之间过渡的比例
Distance Fadeout Fraction远处淡化区域的大小控制动态阴影淡出区域的大小
Inset Shadows for Movable Objects可移动对象插入阴影(仅静态光源)即便是级联阴影贴图启用时,是否要使可移动组件逐对象插入阴影

点光源

类似于灯泡, 不过简化为从空间一点朝各个方向均匀地发光了

ue4 中的点光源除了位置信息之外, 还提供了半径和长度

属性

光照

英文中文解释
Attenuation Radius衰减半径越大性能消耗越大
Source Radius光源半径设置光源的半径,以决定静态阴影的柔和度和反射表面上的光照的外观
Light Falloff Exponent光源衰减指数控制光照的径向衰减
Source Length光源长度设置光源的长度 (光源的形状是个两段端具有半球的圆柱体: 在虚幻引擎4中称之为 Sphyl ) 来决定静态阴影的柔和度和反射表面上光照的外观
Use Inverse Squared Falloff平方反比衰减该光源是否使用平方反比衰减
光源概述文件 IES

英文中文解释
IES TextureIES贴图光源概述文件所使用的"贴图"
Use IES Brightness使用IES亮度如果该项为false,它将会使用光源的 亮度 来决定要产生多少光照。如果该项为true,它将会使用IES文件的亮度(一般比虚幻引擎中光源的默认值大很多),以流明为单位
IES Brightness ScaleIES亮度缩放比例IES亮度影响量的缩放比例,因为它们可能会使整个场景变黑

【Tips】 IES文件是ASCII码文件,尽管虚幻引擎将其呈现为贴图,但它们不是图片文件

聚光源

类似于手电筒或聚光灯

ue4 的聚光源与一般的聚光源没有什么区别, 也是通过内切角和外切角来控制衰减

属性

光源

英文中文解释
Inner Cone Angle内锥角设置聚光源的内锥角,以度数为单位
Outer Cone Angle外锥角设置聚光源的外锥角,以度数为单位

天光

天空光照会获取 SkyDistanceThreshold 以外的一切物体作为光照

SkyDistanceThreshold 称为天空距离阈

这些物体可以包括__大气层、云层、远处的群山、cubemap__等

天光捕获场景的时机

静态天光 -- 构建光照时会自动捕获

固定或动态天光 -- 加载时捕获 or 调用 Recapture Scene 时捕获

【Tips】天光会比环境光照 (Ambient Cubemap) 更加真实 -- 支持局部阴影

静态天光

只会捕获静态或固定的物体, 并将光照烘焙到光照贴图中

【Tips】移动平台只支持静态天光

【Tips】静态天光采用__过滤的立方体贴图?__来优化其方向性

固定天光

与固定的光照相同, 直接光可以在运行时修改 (延迟着色直接渲染)

而间接光则会烘焙到光照贴图中去

动态天光

动态天光实时地进行光照计算, 性能消耗比较大

【Tips】动态天光可使用__距离场环境遮挡__优化

属性

英文中文解释
Source Type源类型SLS捕捉场景 -- 从捕获的场景 (Sky Distance Threshold以外的一切) 构造天光; SLS指定的Cubemap -- 从指定的立方体贴图中构造天光
Cubemap立方体贴图如果 Source Type 设置为 SLS_SpecifiedCubemap 时,定义要为天空光照使用的 Cubemap
Sky Distance Threshold天空距离阈值从 天空光照 位置算的距离,该数值下的任何东西都会被认为是天空的一部分(也会参与反射捕获)。
Lower Hemisphere is Solid Color下半球是纯色是否将来自下半球的光线设置为 0。这对防止下半球的光线溢出是有有用的?
Recapture Scene捕捉场景当 天空光照 Actor 设置为 SLS_CapturedScene 时,用于重新捕捉场景

总结

本文只是对 ue4 的光照和阴影做一个整体的概述, 并没有涉及到其中具体的一些光照和阴影方案及其实现原理

接下来打算将光照和阴影分别研究, 期望总结出性价比较高的光照配置方案。

参考

Unreal Engine 4 的 光和影

ue4官方文档 照亮光照

UWA 虚幻引擎学习之路 光照系统