从零开始独立游戏开发学习笔记(四十四)--Unity学习笔记(二十)-- Creative Core(三)(上)

445 阅读26分钟

5/27:怎么回事,爱言叶 IV 这么快就出了。但仔细一看,III 居然已经是 4 年前的事情了,时间过的是不是太快了啊。歌词里的各种串烧一点情怀都没有,串烧的歌我可是一直听到现在的啊。

5/29:学这个系列容易犯困。

所以今天我们要来学习 Creative Core 的第二部分 - 光照

1. 光照基础

1.1 判断下图场景中有哪些光源

image.png

  • 其实有三种:路灯,霓虹灯,和天空光。

1.2 光照是如何工作的

在 Unity 中,光照是对现实光照的模拟。即使你想做一个不遵循现实物理规则的光照效果,了解其在 unity 的工作模式也有助于你修改其表现。

1.2.1 光源的属性

所有的光照都有一个光源,所以我们先捋一捋光源的一些属性: image.png

光源有三个关键属性:

  1. 形状:光源的形状会影响光照的方向。
  2. 大小:光源的大小会影响光照影响到的区域。
  3. 强度:光源的强度会影响光线能传播多远,以及有多亮。

上图中的两个光源的对比:

  1. 路灯的形状使其方向单一,且呈现一个圆形。月亮则是呈现一个球体发散的方向。
  2. 路灯比较小,因此只影响到小部分区域。月亮会影响整个地面。
  3. 但是路灯的强度足够让其照射的区域很亮。月亮的强度很高,但不够高,因为离地面太远。

1.3 我们如何感知光线

为了模拟光线,我们有一个光源 source,以及一个感受器 sensor(人眼,照相机等等)。
image.png

我们看到物品,是因为光线照在物体上,反射到人眼上,或者照相机的底片里。

1.4 如何改变光线的方向

光线有两种改变方向的方式:

  • 反射
  • 折射:白光只是一系列的光谱组合,当白光通过三菱镜后,不同颜色的光谱因为折射度不同被分开,我们就看到了彩虹。

image.png

在本教程中,主要集中于反射。

2. Unity 光照起步

打开教程演示项目,进入户外场景。我们这里选择上方工具栏里的 window->rendering->light explorer

image.png 这里可以看到场景中灯光的一些重要属性,以及可以在这里进行一些调整。 (一般建议是把这个 tab 放在左下角的布局)

然后,我们再看另一个窗口 window->rendering->lighting。
image.png

在这里,我们可以在 scene level 上进行设置。 (一般建议是放在右边,inspector 的附近)

2.1 直接光和间接光的区别

直接光就是光线从光源里出来,只经过一次反射后,到达 sensor。
间接光就是一些反射多次的光线,或者非太阳直射的天空光(因为已经在云层里反射过了)。

2.2 全局光照(Global illumination,也称 GI)

在游戏引擎中,全局光照包含直接光和间接光,用于模拟真实光照。

Unity 中有两种 GI 系统:烘焙 GI 系统和实时 GI 系统。(才怪,接着看吧)

2.2.1 烘焙 GI 系统

烘焙 GI 系统包括:

  • Lightmapping(光照贴图):看名字也知道这和贴图相关。其实原理很简单,就是预先计算好光照的信息(也就是场景上各表面上光照的强度等信息),储存在 texture 上,这个 texture 就叫做 lightmap。Unity 的 GI 系统有一个专门的 lightmapping 系统叫做 progressive lightmapper(渐进式光照贴图,也称 PLM)。
  • Light Probes(光照探针):光照贴图是完全静态的,而光照探针则是用来处理部分动态的光照效果。
  • Reflection Probes(反射探针):用于模拟更真实的反射。

unity 里所有的 pipeline 都支持烘焙 GI 系统。

2.2.3 实时 GI 系统

Unity 目前根本没有一个成熟的实时 GI 系统。我就说教程写的这么模糊,各种已废弃,或者废弃后又重新捡起,却又加了一句 2024 年前还要再次废弃是在搞什么。官方手册含糊其辞,网上也找不到说法。结果搞半天根本就没有一个成熟的系统,只有一个不知道会不会被废弃的功能。

现在确实是有一个叫做 enlighten real-time GI 的功能,不过这个功能即将在 2024 LTS 废弃。现在有,只是为了在替代品出来之前,让你能用上实时的间接光照而已。

2.2.4 注意 enlighten real-time GI 和 enlighten baked GI 的不同:

前者是这个东西: image.png

  • 没错,根本就没写 enlighten 这个单词,但是官方手册上叫这个功能为 enlighten real-time GI,非常迷惑。
    不开启的话,unity 就只会计算实时的直接光照,开启的话 unity 就会自动计算实时的间接光照。此外,开启这个之后,light probes 的一些表现也会发生变化,等等。

(但是呢,这个功能即将在 2024 年废弃,可能 unity 官方觉得自己能在那之前做出一个类似于 虚幻5 的 lumen 那种全局光照系统出来吧)

后者则是 enlighten lightmapper: image.png 这个玩意已经早就废弃了,留在这里只是为了一些兼容性考量。(HDRP 直接就删了)

你可真会起名字啊,unity。(辱骂)

real-time GI 和 lightmapper 没有冲突关系

当你勾选了 real-time GI 之后,只是会改变一些光照表现行为诸如动态的间接光照,以及 lightmapper 里的 light probes 的表现等,具体请看手册。

real-time lighting 和 baked lighting 又是另一个东西

即使我们不勾选 (enlighten) real-time GI,在 unity 中仍然同时包含 real-time 和 baked 光照。就像刚刚提到的,即使在 baked GI 系统中(也就是不勾选 (enlighten) real-time GI),虽然没有实时的间接光照,但我们有实时的直接光照啊,这依然是 real-time lighting,只不过系统不是 real-time GI。

也就是说 real-time lighting 与 baked lighting,和 GI 没有关系。GI 是对一个整体光照系统的表现的设置(所以叫全局)。real-time lighting 和 baked lighting 则是具体到实际游戏的时候的表现,只是用于描述光照的信息在什么时候计算而已。

unity 里,不同物体可以应用不同的计算方式,可以有的用 real-time lighting,有的用 baked lighting。

2.3 real-time lighting 和 baked lighting

unity 里,real-time lighting 指那些在运行时计算的光照,每一帧都会重新计算光照信息。因此移动物体的时候,光照效果也会跟着改变。

但是 real-time 的性能消耗较大,因此有些情况我们会提前计算好光照信息,存储在 lightingmap 上。运行时直接使用即可。

把光照信息储存为 lightmap 这一行为叫做烘焙(baking 或者 lightmapping)。在现版本的 unity 中,我们使用 PLM(progressive lightmapper)来计算光照贴图。

不过问题在于光照效果并不会发生变化,移动光源,光还照在之前的地板上。

3. directional light(定向光) 和 skybox(天空盒子)

当我们新创建一个 unity 项目的时候,sampleScene 里可以看到一个蓝色的天空,此外,场景中有一个物体叫做 directional light。

3.1 光源的种类

照明设计的一个初始步骤是识别光源的种类,光源分为:

  1. 自然光(natural lighting):通常是太阳或者月亮。
  2. 模拟照明(motivated lighting):模拟真实物理世界的光。如路灯,车头灯等。
  3. 主光照(key lighting):通常不知道光源是啥,但是聚焦于场景中某个处于焦点中的物体上。(也就是摄影中的主光灯)
  4. 环境光(ambient lighting):在 unity 里也被叫做 diffuse environmental lighting。也是来自于一个不确定光源的光。

还有更多种类的光,但本教程只涉及这几类,在设计照明的时候,可以从这几个角度出发来想。(可以参考影视照明)

3.2 配置定向光

实际上,directional light 正是模拟自然光,模拟太阳光和月亮光的。

之所以叫定向光,因为光线全都是平行的直线,正如太阳光一样(虽然太阳本身是个点光源,但是由于太大了,照在地球上就是个平行光线)

gizmos 上也展示出了这一平行的特性,还会告诉你光线的朝向:

image.png

  • 定向光线的位置是无所谓的,结果都一样,毕竟是自然光。
  • 不过方向是有用的,可以改变光线的方向。

3.3 一些高级用法

定向光也有一些别的用法,诸如多个定向光,昼夜交替等等,这些不会在本教程中涉及到。

3.4 天空盒基础

在 unity 中,天空背景使用的是一种特殊的材质来创建的,叫做 skybox。skybox 是在不同面上有着不同的 texture 的立方体。

当你选择用 skybox 来渲染天空的时候,unity 会先把整个场景放在一个立方体中。unity 会最先渲染这个立方体,因此场景中的所有东西都被渲染在 skybox 前面(所以 skybox 能作为背景)。

unity 尽管只提供了一个蓝色的天空,但你可以让其包含一些远景特征来增加深度和空间感,诸如:

  • 背景里放一些远处的山水。
  • 放一些建筑物。

skybox material

skybox 的材质比较特殊,需要使用专门的 skybox shader,skybox shader 分为两类:

  • Textured:使用一个或多个 texture 来生成 skybox。
  • Procedural:使用材质上的属性来生成 skybox。

3.5 创建一个新的 procedural skybox

这里我们创建一个自己的 skybox 来试试:

  1. 创建一个 material。
  2. shader 改为 Skybox Shader/Procedural。(其他 3 个都属于 Textured 类)
  3. 赋予给 lighting->environment->skybox material。

然后我们来调整各个属性来看看其表现:

  • sun:可以看到天空中有一个太阳,这个属性只会影响这个太阳的大小,并不会影响光照效果。
  • atomosphere density:大气层密度,这个属性越高,大气层吸收的光线就越多。
  • color tint 和 Ground:改变天空和地面的颜色。
  • Exposure:调整天空盒的曝光,越高就越亮。

4. 添加其他光源

刚刚我们创建了自然光,现在我们要给场景中添加一些其他光源了。

4.1 点光源和聚光灯 motivated lighting

这里介绍另外两种光源类型:point light 和 spot light。效果很明显,拖出来看一看就知道。前者是个发散的光源(如灯泡等),后者是一个圆锥型(如舞台灯,手电筒)。

一些属性的效果:

  • range:光线能传播到多远。
  • itensity:有多亮。
  • indirect multiplier:间接光每次反射后强度的改变。如果低于 1,则每次反射后强度会变低(这也是真实世界的情况),如果高于 1,则每次反射后强度会变高。(不符合真实物理规则)
  • color:顾名思义。

4.2 光和颜色如何运作

让我们来看看光和颜色运作的物理科学。

4.2.1 我们如何感知颜色?

虽然这些都是初中学过的。但不妨再回忆一下。

太阳光是白色的,而这是所有光谱颜色混合在一起,被人眼感知的结果。而一个黄色物体,是因为它吸收了除了黄色光以外的所有颜色。

4.3 检查色彩空间

如果出现灯光的亮度不成比例的话,可以去检查是否为线性色彩空间。
URP 中,默认是线性色彩空间。
普通模板中,是 gamma 色彩空间。

gamma 色彩空间是对人眼进行调校的结果,而线性空间则是更精确没有校正的结果。具体可参阅手册

切换色彩空间

Edit->Project Setting->Player->Other Setting->Color Space。

4.4 配置环境光

环境光是没有特定来源的光。Unity 的环境实时光照会被计算存储在 lightmap 里。

前往 lighting -> environment ,之前我们在这里设置过 skybox material。现在我们关注 environment lighting。

skybox 环境光

可以看到 environment->source 现在被设置为 skybox,这表示环境光由 skybox 提供。这一做法一般来讲简单有效。 image.png 下面的 intensity mutiplier 可以调整环境光的强度。

注:物体想要被计算环境光贴图,需要事先被设置为 static 才行。因为要保证在运行的时候不会乱动。

gradient 环境光

将 source 改成 gradient。

  • sky color:天空的环境光,影响物体上方的光照颜色。
  • equtor:附近的环境光,影响物体周围的光照颜色。
  • ground:地面的环境光,影响物体下方以及周围的光照颜色。

color 环境光

简化的 gradient 环境光,影响物体所有表面的光照颜色。

5. 配置场景中的阴影

阴影和光照如影随形。

5.1 配置 render pipeline asset

在 unity 中,所有的阴影被储存在一个叫做 shadow map 的 texture 里。这个 texture 的分辨率越高,则阴影越清晰。当游戏渲染的时候,阴影会被渲染在画面之上。

我们首先去在 render pipeline asset 里设置阴影的总体效果: image.png

来看一下这些配置:

  1. max distance:顾名思义,就是设置阴影离照相机多远的时候才会被渲染。越大,画面中阴影就会越多,越小就越少。除了性能考量,还会有一些特殊 artstyle 的需求。暂且不表。
  2. 最下面有两个 bias,depth bias 和 normal bias,这两个是为了解决阴影失真的情况(shadow acne)。有时候阴影和光照的位置并不对,或者会有阴影中夹杂着光照的情况,这种情况叫做阴影失真,具体可以参考这个知乎问题
  3. soft shadows:勾选后,会进一步处理阴影,让阴影看起来更平滑。不过现在设置不一定能看到效果,为什么要下一小节再讲。
  4. cascade count:这个属性控制 shadow cascade(阴影级联)的数量。摄像机近处的阴影比远处的阴影分辨率更低,会有一些明显的锯齿产生,这一情况被叫做透视阴影(perspective aliasing)。解决这一现象的方式就是 shadow cascade。增加 cascade count 可以有效改善近处阴影的分辨率。(不过阴影级联只对定向光有效)

阴影级联(shadow cascade)

我们再细讲一下阴影级联吧。也可以参阅 unity 手册上的该部分

首先我们看一下透视阴影的表现: image.png

B 处比 A 处锯齿更多。这是因为这两个地方用的是同一个阴影分辨率。当然,你可以直接通过增加阴影的分辨率来完成这一效果,不过这样性能消耗就比较大,因为远处用不到这么高的分辨率。

在说解决方案之前,我们来解释一下这个现象的原因。
这是因为在 unity 中,我们的摄像机是应用了透视效果的视椎体。也就是近大远小。远处的大物体和近处的小物体是一样的尺寸,如下图:

image.png

上图显示的是实际场景的尺寸大小,可以看到这个球非常大,摄像机的视椎体投射到后面的时候已经非常宽了。读者可以试想一下现在摄像机屏幕的样子是什么样的,实际上,上图红色实现部分的梯形中,左边和右边在摄像机眼里是一样的长度的。

那么,这种情况会造成什么问题呢?我们再考虑一下阴影贴图的情况: image.png

  • 首先我们要知道,这一帧,摄像机会并根据设置的阴影分辨率来读取阴影贴图,然后渲染到画面上。
  • 然而,上图中可以看到(假设背景的格子是阴影贴图),远处的地方读取了 20 个格子的阴影数据。因此效果非常好。而近处只读取到了 4 个格子的阴影数据,因此很模糊。(因为在屏幕中都是一样的大小,你把 4 个格子部分的阴影放大 5 倍来看,自然分辨率就会很低了) 解决这一问题的其中一种方案是使用 soft shadws 或者增加阴影分辨率:
  • 也就是把以上的格子直接增加 5 倍密度,让 4 个格子的部分拥有之前 20 格子的质量,当然就能解决。不过还是那句,这样性能消耗过大。远处根本不需要这么高的分辨率。

另一种方式就是使用 shadow cascade,其实就是讲视椎体分成多个部分,提高近处部分的分辨率: image.png

  • 左边近处部分应用了更高的分辨率。
  • 这也是可以理解的,近处的物体自然需要更高的分辨率来提高真实感。
  • 提高级联数量(cascade count)会增加分割份数,会更真实平滑,当然也会提高性能消耗。不过无论如何,这也比直接提高总体阴影质量要好。

总结

虽然理论说的很复杂的样子,但实际上很好理解。把一个分辨率低的图缩小就会感觉比较清晰(对应在游戏中,就是屏幕远处的地方)。因此我们让远处的图分辨率还是那么低,但是近处的图分辨率提高。

5.2 设置定向光的 soft shadow

我们在 pipeline 里设置了 soft shadow,但是这个是一个全局的设置。具体到每个光源产生的阴影还是要各自配置的。也因此为什么刚刚勾选后,不是所有的阴影都改变了。

我们可以去到 directional light 里看看,有一个 shadow type 的选项: image.png

可以看到我们给定向光设置的还是 hard shadow,自然全局开不开 soft shadow 和它也没有关系了。我们改成 soft shadow,就可以看到软阴影的效果。下面还可以看到一些别的设置,都是对单独光源阴影的设置。

同理,也可以根据自己喜好单独更改那些 motivated lighting 光源的阴影效果。

注:软阴影虽然比起级联阴影还是要多消耗性能,但比直接提高阴影分辨率还是要好一些的。如果对边缘清晰度没那么高的要求的时候可以开。

5.3 后处理(post processing)

就像是在拍照之后,发现照片与实际的颜色光照效果有区别,想要使用滤镜来弥补或者提高表现力。这种就是后处理,不过现代照相机一般直接提供比较简单的一键处理效果。如果用过 LR 这种软件来处理相片的话,会知道专业的后处理其实包含很多种属性的调整。

不过,具体的后处理之后会单开一篇文章来讲,这里就不说了。

不过教程给的示例场景中已经有一个叫做 postprocessing 的物体,可以点开看看试试。

6. 烘焙光照贴图

之前我们做的都是实时光照,现在开始试着烘焙光照。这个学完之后,我们就学完了基础的户外光照知识了。
然后我们在稍微提一下实时光照和烘焙光照:

  • 实时光照会在每一帧重新计算,会根据光源的位置和物体的位置来计算。比较消耗性能。
  • 烘焙光照则是预先计算好光照,运行的时候 unity 无需计算,而只需要把贴图映射到场景中。烘焙光照自然也无法动态地发生变化。
  • 计算光照的过程会为整个场景计算 UV 坐标(正如材质映射纹理的 UV 坐标一样)。这个特殊的纹理贴图被称为光照贴图,这一过程叫做 lightmapping 或者烘焙(baking)。

烘焙光照不仅高效,也会生成更加逼真的光效。(间接光照有了)

6.1 改变灯光模式(ligth mode)

在 unity 中,light mode 也就是 baked,real-time,mixed 这三种。

如果是跟着示例项目走的,目前场景中所有灯光应该都是 real-time。

  • 去到定向光,把 light mode 改成 baked。

image.png

  • 你可能会想把其他光源也用同样的方式改成 baked,但你还记得 light explorer 吗?这个时候使用 light explorer 其实更加方便。

image.png

6.2 把光源改为 static

虽然 light mode 改成 baked 了,但此时你移动光源,发现还是实时的。我们还有两步要走。

第一步是,如果要使用烘焙光照,首先我们要保证这个光源,以及照射到的物体不能移动,不然运行的时候就会露馅。因此我们需要把光源设置成 static。还有光源照到的物体也要同样设置为 static。(其实只要是在运行时保证不会动的物体,都应该设置为 static,不只是光照计算,也可以避免做一些别的不必要的计算)

  • 把整个 environment 设置为 static。
  • 把所有光源设置为 staic。

6.3 烘焙

第一步走完了,依然看不到效果,因为我们现在还没有开始烘焙呢,只不过是做好了烘焙的准备。

所以第二步就是正式烘焙光照了。

  • 开始之前,我们先在场景里放一个光源,不要改成 static。再创建一个非 static 的 cube,放在非 static 光源之下,用来对比。 然后正式烘焙:
  1. 点击 lighting->scene->lighting settings->new lighting setting 创建一个新的光照设置。命个名,如 BakedLighting。
  2. 改变 Mixed Lighting->Lighting mode 为 baked indirect。
  3. 点击下方的 generate lighting,等待一段巨长的时间,下方有进度条。(如果太慢的话,可以把 PLM 设置成 GPU)
  4. generate 之前检查是不是该设置的都设置了,免得等半天发现一个物体忘了该 static 或者啥的,又要重来一遍。

6.3.1 测试:

  1. 移动静态光源,发现光照还在原地。
  2. 移动静态物体,发现光照永远在物体的固定位置上。
  3. 移动之前创建的非静态光源,发现光照是可以变化的。
  4. 观察刚创建的 cube,因为没有 static,虽然在光源下面,却是一个全黑的样子。(因为定向光也被我们改成 baked 了)
  5. 移动那个实时光源,发现这个光源可以照亮所有的东西,无论是不是 static。照在烘焙过光照的物体上会有光照叠加效果,只要不移动那个物体也不会显得违和。

6.3.2 结论

根据上面现象可以得到以下结论(这个结论只讨论在 baked 模式 + baked indirect 模式。如果是 mixed 模式效果会很复杂的):

  1. 光源被设置为 static,再点击烘焙之后,光源就可以说没用了,这个时候你把光源删掉,光照效果都还在。
  2. 没有设置 static 的物体上不会被烘焙光照贴图,只能被实时光源照亮。
  3. 实时光源不管你物体是啥,都能造成实时光照效果。 可以说,烘焙光照的效果就像是把光源给掐灭了,然后在 static 物体上画出一些亮光的颜色。

6.4 添加 area light

之前一直没有提到 area light,是因为 area light 只能被烘焙。area light 的形状是一个矩形或者圆形。

由于没有实时效果,因此很难调整,可以打开 gizmos 来帮助判断最后的效果。

6.5 mixed

light mode 里还有一种效果 mixed,也是之前一直不提。

mixed 如名字一样,介乎于实时和烘焙之间。根据设置有不同的效果,在 lighting->mixed lighting->lighting mode 中可以更改。不同的模式效果在下面有说明。

image.png

  • baked indirect:就是之前烘焙的时候更改过的,现在知道为啥是放在 mixed lighting 下了吧。如果是 mixed 的光源,表现为实时的直接光 + 烘焙的间接光。如果是 baked 光源那就是全部烘焙光。这种模式适合中档硬件。
  • subtractive:这种模式的话,mixed 光源同时烘焙直接光和间接光。但是如果光源下的物体是动态的话,会受到实时光照的效果,但是不会投射阴影,不过会有一个 directional light 投射下来的阴影。(表现为一个动态物体在一个 mixed 光源下,有实时光照,但是阴影却不是这个实时光照的阴影,而是定向光的阴影),专门为定向光空出一个位置是为了不让阴影显得过于奇怪,有些时候这种表现手法也是可以接受的。如果物体是静态的,那就和 baked 模式一个效果,当然静态物体反正也不能动不需要实时阴影。读者应该也能猜到,这种模式适合比较低档的设备。
  • shadowmask:和 baked indirect 一样,属于实时的直接光 + 烘焙的间接光。但是会自动融合实时阴影和烘焙阴影。这种效果最真实,同时性能消耗最大。适合高档设备。

还想了解具体信息可以参考手册。不过只要遵循静态物体不要动,以及了解不同模式适合什么档位的设备,对于小项目来说足够了。

7. 使用 light probes(光照探针)来改善光照效果

假设我们有一个静态物体,我们首先想到的是使用烘焙光照。不过问题在于,物体是不动了,但你没法确保没有动态物体经过这里啊,人走过,汽车开过都应该有投射。但是难道因此我们就要屈服,改成实时光照吗?

不会,因为我们有 light probes。

7.1 什么是 lighrt probes

如果把光照贴图理解为物体表面的颜色信息的话,那么 light probes 就是光源和物体之间那段空间的光照信息。有了这个信息,有物体穿过这个空间的时候,就可以计算出光照信息了。在游戏运行时,如果有物体经过某个 light probe 附近(多个 probes 找最近的),那么就会用这个探针的信息来计算该移动物体的光照。

light probes 为什么有用

比起实时光照更高效,也更真实,又带有不错的动态光照信息(如果放置合理的话)。

light probes 一般用于静态光源+动态物体的情况。不过如果有些场景光源改变很大的话,也很有用。玩家也不想看到光源变了,动态物体还不变。

7.2 light probes 放在哪儿呢?

light probe group 组成 light probe groups。每一个 light probe group 里又包含多个 light probe,每个 light probe 都包含它和它周围的 light probes 之间的光照信息。

最简单的方式是在你想衡量的光照空间内(比如说路灯和其照射的范围内),组成一个普通网格形状。这个网格应该至少包含两个垂直层,因此也被成为 3D 体积。(3D Volume)。比如: image.png

有了这么一个 light probe group,我们可以复制它,连在一起组成 light probe groups。

image.png 当然,不是说所有的 groups 都要一样。完全可以独立设定,某些地方可能光线变化比较大,就让探针密集一点。

听起来很复杂,也确实很复杂。但是可以帮助你有效地优化光照效果。

7.3 放置 light probes

那么,我们要自己试着放置了。

  1. 在 hierarchy 里新建 light->light probe group。
  2. 移到能看的到的地方,可以改变位置大小啥的。
  3. 点击 edit light probes(那个图标)
  4. 选择 select all,然后 deplicate selected,然后就可以拖动来扩展了。当然你要是愿意也可以一个一个拖。
  5. 我们让其布满我们想要抓取数据的空间。
  6. 记得要包裹住光源。

效果: image.png

  • 有一个问题,球体的所有面都发光了,但按理来说背面不应该发光。
  • 我们可以尝试取消勾选 remove ringing,这个勾选上有可能会导致探针信息不对。一般是在 ringing 现象出现的时候才会勾上。

下面这个是错误示范: image.png

  1. 没有光源的地方也有一大堆探针。
  2. 只覆盖了光源周围的空间,没有覆盖到下面的空间(光能照到的部分)。
  • 因此可以看到球体并没有被照亮。把球体往上移动才会被照亮。

7.4 使用工具测试 light probes 的有效性

虽然拖一个球体来看也不错啦。但是 unity 有专门提供工具来进行测试。

可以在 light explorer->light probes 里看到探针的状态 image.png

还可以在 scene 上方的工具栏里切换 draw mode 为 contributors/receivers。(之前设置 wireframe 的时候用过) image.png 不同的颜色代表不同含义写在右下角。/ 左边表示是否对 GI 有贡献,/ 右边表示是否接收 GI,如果有接收了哪里来的 GI。

看不到路灯是因为路灯和地面都是蓝色,换个角度就能看见了:

image.png

7.4.1 颜色的含义

  • 黄色\color{#e5cb84}{黄色}:因为球体是非 static 类型物体,对 lightmap 没有贡献。但是接收了 light probes 的光照信息。
  • 蓝色\color{#5994a1}{蓝色}:static 物体,会参与 lightmap 的计算,同时也会接受 lightmaps 的信息。烘焙过的物体正常来说都应该是这个颜色。
  • 红色\color{#dd735b}{红色}:该物体参与 lightmap 的计算,而且还能接收 light probes 的光照信息。

使用这个 draw mode 可以让你更好地分辨出场景中存在的问题,光照是否按照你想的那样运作。

7.5 其他光照设置

lighting-scene 窗口还有很多属性我们没用上,可以自己探索,以下是一些比较重要的属性:

  • bounces:控制光照的最小和最大弹跳数。与间接光照有光,越多需要计算的也越多。
  • lightmap resolution:顾名思义,分辨率。和阴影分辨率一样,越大越好。不过性能消耗也会越多。
  • albedo boost:提高反射率,虽然这个一般是我们在 material 上控制的。但是我们也可以在光照这里总体再提升一下。
  • indirect intensity:顾名思义,间接光的强度。

可以自己尝试改变一下看看效果,此外,鼠标移到属性上也会显示这个属性的解释。不过基本上来说,增加光照效果的都会同时增加性能消耗,这点需要注意。