zl程序教程

您现在的位置是:首页 >  系统

当前栏目

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

系统 使用 UE4 光照
2023-06-13 09:14:16 时间

前言

为了更好地进行光照测试, 我们需要对场景做一些设置。 当然这些设置不是必要的, 只是一些个人的强迫症式的做法, 这里列举一下。

首先给场景加了一个 landscape, 然后增加了一个没有镜面光 (设置 Specular 为 0) 的材质给它, 这样只是个人看起来比较舒服而已-_- 增加了 ppv (后处理体积) 和 liv (lightmass重要体积) 然后通过后处理 (post process) 对 GI 产生的光照 (间接光) 修改了一下颜色, 以增加对间接光的辨识 去掉了天空盒

下面我们将按照三类光源 (静态 动态 固定) 分别作用于不同的物体 (静态 动态 固定) 上, 同时对于不同的光源种类 (平行光 点光 聚光) 也作适当的分类讨论。

静态光源

静态光源对静态物体

平行光

静态光对于静态物体,会完全烘焙光照 (通过 lightmass),使用光照贴图 lightmap 作用于物体。

静态光

所以从这一点来看, 静态光对静态物是没有直接光照的, 即没有直接照射于物体的光, 所有的光照都来自于光照贴图。

我们打开 ppv 中的间接光的红色效果, 会发现整个场景都红了 (得亏没设成绿的。。)

从实际的角度来看,真正的间接光的定义是, 不是直接从光源照射到物体上, 而是通过多次弹跳 (bounce) 后反射到物体上的光。

上面显示全红的原因并非它们都是通过多次 bounce 的间接光, 而是说它们都是从光照贴图而非光源得到的。

我们将 WorldSetting 里的 Lightmass 选项里的 Num Indirect Lighting Bounces 设置为 0 (默认是3, 表示间接光会弹跳3次)

可以看到背着光的部分完全变黑了, 相对于第一张图少了一些光, 少的这些光才是真正的经过多次 bounce 得到的间接光。

除此之外, 也可以通过调节光源的细节面板里的 Light -> Indirect Lighting Intensity 来调节间接光 (bounce > 0) 的强度。

【结论_Begin】

  • 直接光照 -- 来自 lightmap -- 没有经过弹跳 (bounces == 0) 的光 -- 静态
  • 间接光照 -- 来自 lightmap -- 从 WorldSetting 设置 bounces 次数 -- 静态

【结论_End】

【Tips】 这里的直接光从技术上讲不算是直接光, 可说是间接从 lightmap 得到的光

【Tips】 间接光 (bounce > 0) 可通过光源的 Indiret Lighting Intensity 属性调整强度

点光源 & 聚光源

静态的点光源和聚光源对静态物的作用与平行光相差无几

点光源可以调节 衰减半径 (attenuation radius) -> 在细节面板的 Light -> Attenuation Radius

聚光源除了衰减半径, 还可以调节 内切角 (inner cone angle) 和 外切角 (outer cone angle), 也是用来控制衰减范围的, 在细节面板的 Light -> Inner Cone AngleLight -> Outer Cone Angle

天光

天空光源比较特殊, 它需要结合天空盒来作一些处理。

天空光源会把远方的静态或固定物体 (距离大于 sky distance threshold) 的光收集过来, 对当前的场景产生__环境光漫反射__,

sky distance threshold 是天光的距离阈值, 可在天空光源的细节面板 Light -> Sky Distance Threshold 设置。

这也是它与平行光的主要区别, 即它的光源是从远方的四面八方收集过来的。

除此之外, 这些光照到静态物体上就和平行光旗鼓相当了, 也分直接光 (bounces == 0) 和 间接光 (bounces > 0), 也是通过天光的 Light -> Indirect Lighting Intensity 属性调整间接光强度, 也可通过 WorldSetting -> Lightmass -> Num Sky Lighting Bounces 设置间接光 bounce 的次数。

下面分别是间接光最弱 (intensity == 0.0 & bounces == 0) 和 最强 (intensity == 6.0 & bounces == 10)时的不同表现。

至此, 静态光源对静态物体的作用我们就分解完了, 说了这么多, 还没见过光照贴图是什么样子的, 下面让我们来看看 lightmap 的模样。

看不懂~~~, 但说明是有 lightmap 的。

【Tips】 HQ 表示高质量的 lightmap, LQ 静态低质量的 lightmap。

我们多打一些静态光,然后运行游戏, 尝试显示其 rendering 信息, 输入命令 stat lightrendering

可以看到, 除了一次 render call 之外 (应用光照贴图), 并没有其他的什么消耗, 性能极高

静态光源对动态物体

静态光源对于动态物体并没有什么好感, 因为无论如何, 静态光源都不会产生直接光 (这里指不经过光照贴图直接渲染), 静态光源从来都是生成光照贴图, 然后从光照贴图烘焙到物体上。

那么对动态物体来说, 也可以直接从光照贴图进行烘焙吗, 显然是不可能的!(不然还要动态GI做什么)。

那么按照目前的思路, 光照贴图对我们的动态物体是无效的, 就是说场景中的动态物体会显示黑色, 我们来看一下。

咦? 并非如此啊, 这是怎么回事? ue成精了??

(此处省略一万字。。)

原来, 对于静态光源, ue 同样使用了 lightmass 所采用的动态GI方案, 即我们后面会提到的 体积光照贴图 (VLM, volumetric lightmap) 和 间接光照缓存 (ILC, indirect lighting cache), 这两种技术的原理类似, VLM 是 ILC 的优化和替代品, 现在 ue4 默认的设置是 VLM (可以改为 ILC)。

以后会仔细研究这两种方案的实现原理, 这里只简单介绍一下, 最主要的还是能证明现在照亮动态物体的就是这个东西。

其大致实现思路是在空间分布一些光照探针, 然后由 lightmass 在光照构建的过程中预计算这些光照样本的光照, 对于一个可移动物体, 根据它与这些光照样本的位置决定是否进行插值, 最终得到正确的光照。

其中预计算的方法采用经典的 PRT (pre computed radiance transfer, 预计算辐射传递) 算法, 利用三阶球谐 (T-SH, third order spherical harmonics) 快速计算光照和材质的卷积。

而 ILC 与 VLM 的一个明显的区别在于__光照探针的分布__, ILC的光照探针分布在 SM (static mesh) 朝上的表面上, 即动态物体可能运动的范围, VLM 的光照探针分布在整个空间, 但是在 lightmass重要体积 (lightmap importance volume) 里会分布的更多。

ILC 与 VLM 的另一个区别是, ILC 的光照插值计算是基于光照探针的位置的, 而 VLM 的光照插值计算则是基于渲染物体的像素的, 所以效率和粒度都比较高。

下面我们来证明静态光源对动态物体产生的光照确实是 VLM 造成的。

当我们在预览界面把 VLM 的功能去掉的时候, 我们发现动态物体整个都变黑了, 说明它的直接光和间接光都是通过 VLM 进行计算的。

但是这种方法在现实中是不可取的, 即静态光照无法很好地作用于动态物体, 静态光只是作用于静态物体时的情况比较好。

上面所说的情况,不仅适用于平行光源, 点光源 & 聚光源, 甚至是天光, 也同样适用。

静态光源对固定物体

静态光源对固定物体的作用与动态物体完全相同, 且都不怎么样。

静态光源总结

固定光源

固定光源对静态物体

固定光源对静态物体的直接光照 (bounce == 0) 是直接采用延迟着色渲染出来的, 并没有使用光照贴图, 所以一些属性 (除了位置) 可以在运行的时候修改 。

我们将 WorldSetting -> Num Indirect Lighting Bounces 设置为0, 即只留直接光照 (bounce == 0),

可以看到运行的时候光源的颜色是可以动态修改的, 而且其 lightmap 也是全黑的, 因为间接光 (bounce >= 1) 没有打开。

下面我们重新将 WorldSetting -> Num Indirect Lighting Bounces 设置为3, 并启用 ppv 中的间接光红色效果。

上图中红色变化的就是间接光 (bounce >= 1) 了, 这些间接光都是通过 lightmap 进行预计算的, 所以我们看现在的 lightmap 就不是全黑的了。

【总结_Begin】

  • 直接光照 (bounce == 0) -- 延迟着色直接渲染 -- 动态
  • 间接光照 (bounce >= 1) -- lightmap -- 静态

【总结_End】

【Tips】固定平行光、点光 & 聚光、天光对静态物体的光照作用相同。

【Tips】 天空光源的间接光照 (bounce >= 1) 次数通过 WorldSetting -> Num Sky Lighting Bounces 设置。

固定光源对动态物体

固定光源对动态物体的直接光照, 与其对静态物体的完全一样, 也是使用延迟着色直接渲染的。

下面我们重点来看间接光照, 间接光照主要可以使用两种技术。

体积光照贴图

固定光源对动态物体默认的间接光照采用__体积光照贴图 (VLM volumetric lightmap)__。

我们可以通过打开预览界面的显示选项打开 VLM 的光照探针, 以查看其具体的分布。

关于体积光照贴图的原理, 另启一篇。

【ue4】【原理】光照系统_体积光照贴图

间接光照缓存

同时, 我们也可以切换到__间接光照缓存 (ILC, indirect lighting cache)__, 这是旧版本的主要机制, 官方方法是 VLM 会逐步取代 ILC, 通过 WorldSettings -> Lightmass -> Lightmass Settings -> Volume Lighting Method 选项, 选择 Sparse Volume Lighting Samples

重新编译一下光照,那么此时影响动态物体的间接光的就是 ILC 了。

此时也可以显示 ILC 的光照探针, 可以看到, 其分布与 VLM 是有很大差别的。

关于 ILC 的原理, 也另启一篇。

【ue4】【原理】光照系统_间接光照缓存

【Tips】 以上方案同时适用于固定的平行光、点光&聚光、天光。

固定光源对固定物体

固定光源对于固定物体的光照作用与对动态物体相同。

固定光源总结

可移动光源

可移动光源可以在运行时改变所有的属性 (包括位置)。

但是可移动光源不对光照信息进行预处理, 即不烘焙光照贴图。

所以在 lightmass 方案下, 可移动光源对物体是没有间接光照的。

也没有任何有用的 lightmap 产生, 可能会产生两张全黑的 lightmap (如果场景中有可视的物体在)。

可移动光源总结

总结

参考

Unreal Engine 4 的 光和影

ue4官方文档 照亮光照

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