UE4中的物理灯光照明流程

UE4中的物理灯光照明流程

最近一年一直跟进项目中的照明相关的流程,协助地编理清思路

而在知乎也看过很多文章,大部分都是云里雾里, 不知道具体怎么落地,

以及落地的过程中有哪些坑, 怎么解决都缺乏方案

于是把自己的一些想法和遇见的问题分享出来, 希望能帮助到打算使用物理灯光流程的小伙伴

先放Git连接, 不想看文章可以直接下载项目看

什么是物理灯光?

这个问题很重要, 我们先不考虑具体如何使用这个流程,

在第二个分段我们在说具体如何使用各种组件

我们先来定义一下, 什么是物理灯光, 这是我在整个流程中最迷茫,以及弯路走的最多的

我们最开始的想法,就是真实世界是什么数值, 我们就用什么数值

很多文章包括UE官方的一片推荐的文章, 也是这么推荐的, 但是这显然是不对的

如果你仔细划分, 室内外照明大概有这么几块组成:

只是参数上的物理是没有任何意义的

如果引擎无法提供准确的间接光, 反射, 环境光遮蔽, 那么只是参数上的物理是没有任何意义的

以平行光为例, 大概有三种策略:

如果我们照搬10万lux的平行光就会带来很多问题, 比如大光比下很难平衡室内外

例如这种情况:

然后我们把平行光改成4000lux,其他不变:

这样就服从了我们的艺术效果, 这样的改动是直接改动了物理光比, 使用各种同比缩放是无法解决这个问题的, 当然你的游戏如果有特殊的需求, 直接用物理参数也是可以的

使用真实物理参数大概有几个问题:

a. 间接光不足以及不准确, 不管是烘焙的lightingmap, 还是lvm, 还是自研开发的一些方案, 间接光普遍不够准确, 这样室内灯光照明就不够, 而室外更难满足, 因为太阳对室内的照明效果, 哪怕是一个小缝, 都可以让室内亮度充足, 这一点在不添加任何其他光源, 全靠引擎自己的间接光是很难做到的

b. 显示设备无法适应大光比, 现在的设备比较好的显示器例如ROG顶级显示器可以支持到1000nit, 手机普遍在650nit, 在这种设备亮度面前, 10万lux的太阳, 显然是太亮了, 设备也无法呈现人眼的亮度范围, 完全照搬物理参数, 并不能达到模拟人眼视觉的效果

c. 天光遮蔽的不准确, 环境光因为IBL的方案就是无遮挡的, 遮蔽后基本上都不太准确, 遮蔽之后过暗,补偿不足, 遮蔽不足就漏光, 需要各种调试使其准确, 并且类似SSAO这种屏幕方案进一步使其偏离物理基准

d. 游戏性要求, 毕竟我们不是来渲图片, 照明的本质是要服从游戏性, 有时候要凸显某个角色, 有时又要标明某个区域, 各种奇怪的照明需求, 也会进一步打乱原始的照明规划,

e. 雾效的不准确, 现在很少游戏能做到全局的体积雾, 导致空气对光的散射非常不准确,这样会造成另一种看上去很假的情况

那么有没有游戏做的比较好呢? 我感觉大表哥, 全境2 的整套方案很不错, 相对来说是我看过比较准确的, 有不少3A都做的不错, 但是这些都是各种trick + 补偿方案一起上最后呈现出的结果,在具体的使用阶段, 并不是真的照搬物理世界的参数

最后基于以上还有类似的各种情况最后我总结如下:

在目前引擎可以提供的支持下,

不同的游戏根据自己的艺术需求, 引擎特性, 适当调整自己的曝光模式灯光数值,

在项目需求下, 找到一套策略兼容灯光变化的方案, 而不是照搬真实世界的数值


物理照明常用的参数解释以及组件


基于上一节我最后的结论, 我们最后的策略就是:

a.平行光进行缩放

b.局部点光聚光灯光源保持一个物理参考, 衰减情况根据引擎以及美术要求来,可以参考飞利浦提供的灯具文档,使用灯具流程

c.根据天光遮蔽的情况打补光,以及负光来补偿

d.特效如何在动态灯光场景下保持均匀亮度

那么首先我们先明确一些参数问题

先对引擎进行设置:

改变灯光默认单位

Rendering – DefaultSettings – Light Units – Lumens & Candelas

编辑器模式下启用预曝光

Rendering – DefaultSettings – Enable pre-exposure only in the editor


启用大气散射和大气散射影响高度雾, 这样让背景跟好看一些

Rendering – DefaultSettings – ShaderPermutation Renduction – Support Sky Atmosphere & Support Sky Atmosphere Affecting Height Fog

设置烘焙启用LVM

Rendering – Lighting – Light Propagation Volumes


通过以上设置, 我们就把整个环境的曝光, 还有灯光参数, 以及雾效改到同一个标准了

我们首先看下灯光参数:

简单的说,

a.流明: 任何光源朝所有方向发射的亮度叫 Lumens - lm

b.坎德拉: 光源对单一方向的亮度 叫 Candelas - cd

c.照度: 一个表面受到周围直接光+环境光+间接光全部亮度的总和叫 照度: lux - 也是辐射度量学里的irradiance

d.尼特: 这个表面朝某单位角反射出去的亮度是 nit, 也是辐射度量学里的 radiance


在点光聚光这块我一般习惯用流明, 主要是在灯具参考中, 飞利浦提供的文档是全部基于流明的

我们后面会提到飞利浦的照明方案,以及如何落地

首先是衰减:

当光线照射一个倾斜表面的时候

表面受到的照度 = 平行光的照度 * cos θ

基于这一点, 你的平行光对地面的照度,要考虑到平行光的倾斜情况, 除了倾斜之外, 大气对平行光还有散射作用, 正午大气距离最近散射比较少, 伴晚散射较强, 平行光的照度应该有适当变化


有一个现在看起来不太需要的公式可以帮你算出太阳在某个角度下的强度:

E_{dn}=e^{-cm}E{ext}

c=0.21, m=\frac {1}{sinA}

最后联立公式:

y=e^{-0.21*\frac{1}{min x}}[{0<x<\frac{2}{\pi}}]

https://www.desmos.com/calculator/7oxgvahoi0

当然其实你可以不考虑这个, 我觉得太精准是没有意义的

将来我也可以水一篇昼夜,四季, 不同经纬度,晴空下太阳强度的文章, 这块我也弄清楚了

平行光一些参数:

太阳的色温一般是5500k, 你也可以设置成6500k 就是白光了, 根据需要可以自己设置, 昼夜变换中色温也是有明显变化的, 这也是因为大气散射的缘故

在这一步你可以把以下组件扔到场景中:

并勾选上图平行光上的 Atumosphere Sun light选项

这时候我们看到的场景是这样的:

我们丢一些模型来搭建一个小场景:

我们把太阳从10 改为 100000lux

这时候场景就爆了

置入post volume, 改名为:PostOut

边界:

曝光值:

曝光值的设置

这时候场景就不爆了, 这个曝光值大家可以根据这个公式设置:

EV=log_2(lux/\pi)*sin\theta

顺便推荐大家一本书会讲的更详细:

这个公式的出处:

特效校准

有部分特效也需要校准, 在各种曝光下, 特效的亮度相对一致,我们可以用这个公式校准:

AdjustEmissive = FXEmissive*2^{ev}*\pi

根据上面的公式, 10万lux 大约ev = 15, 我们min和max就取正负1

因为太阳10万照度基本是下午2点左右, 我们选30度角, 为了有烈日的感觉曝光补偿给了0.5

我用的是UE4.27,lightingmass设置如下:

然后我们烘焙下质量选择高

对比下path tracing 和 光栅化的结果:

最后场景outliner如下:


室内后处理设置

现在我们已经有了室外, 接着我们布置一下室内

先创建一个新的post, 起名:PostCloseDoor(封闭室内)

这个Post专用于室内

EV设置如下:

注意在最下面设置下权重:

在场景进出的地方在增加一个Post, 起名: PostOpenDoor(开放室内)

EV设置如下:

最后两个post的关系应该是这样的:

最后我们得到三层效果, 室外到室内:

点光聚光灯具流程

我们在室内置入4个聚光+灯具

我现在给的2800流明, 那么我们怎么确定室内光源的亮度呢?

其实可以参考飞利浦提供的灯具文档:

assets.signify.com/is/c

大概的使用场景, 流明数都有, 最重要的是你甚至可以在京东买到:

当然按照我的经验, 我给的2800lm,

在这里在介绍另外一个东西

IES

其实不同的灯具, 可以产生不同的灯光质感, 还有灯的形状

手游中很少使用, 因为IES在UE里是以纹理的形式存在的, 会增加一定开销, PC游戏就无所谓了

IES查看器:Home " Photometricviewer.com - IES viewerIES查看器:

你可以去飞利浦的官网下载IES文件, 然后用这个查看器预览灯光的各项属性

然后我们来看下整体的效果:

但是10 00 00的照度, 在室内看室外确实有点爆

我们把场景复制一份, 然后平行光调整成1500lux, EV设置7-8对比下效果:

室外基本是差不多的

open doorEV用5-7:

CloseDoor 还是用3-4:

Path Tracing:

雾效

最后加上高度雾再看一下:

加上雾效之后, 场景的空间感会更强,

但是也会带来一个问题, 由于UE里的雾并不是真的在计算光在大气中的散射

UE如果用高度雾的话, 如果你的光比比较大,在进入场景之后, 也要同时调整雾效的强弱

可以根据需求,进一步调整到你想要的参数, 至于纯粹的光照部分可以用path tracing作为烘焙后的结果校验,

是参数不对, 还是间接光的问题,都可以参考

photo realistic – look dev


这个流程目前国内游戏非常少用到大概思路我讲一下:

目标: 还原真实世界的某个场景, 例如MGS当年的分享, fog engine如何还原真实世界的会议室

这里有两个视频可以参考:

youtube.com/watch?

youtube.com/watch?

假如你的游戏是想复刻某个真实场景, 可以大致参考以下步骤,还原灯光环境:

步骤:

1 在真实世界拍摄环境图, cubemap

(拍摄时, 用中灰球和铬球作为基准参考)

2 在游戏中启用该hdr图

3 在游戏中调整亮度参数,

直到还原铬球和中灰球在HDR图中的亮度

金属球:Roughness=0.1; BaseColor=0.95;

灰球:Roughness=0.95;Basecolor=0.18


最后

又是好长,能看到这里的都是勇士

如果有什么不清楚或者遗漏可以评论提出,我可能会漏掉一些内容

光照这块的东西确实很纷乱, 希望可以帮到你

编辑于 2021-07-28 07:30