【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 Texture | IES贴图 | 光源概述文件所使用的"贴图" |
Use IES Brightness | 使用IES亮度 | 如果该项为false,它将会使用光源的 亮度 来决定要产生多少光照。如果该项为true,它将会使用IES文件的亮度(一般比虚幻引擎中光源的默认值大很多),以流明为单位 |
IES Brightness Scale | IES亮度缩放比例 | 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 的光照和阴影做一个整体的概述, 并没有涉及到其中具体的一些光照和阴影方案及其实现原理
接下来打算将光照和阴影分别研究, 期望总结出性价比较高的光照配置方案。