一、全局光照(Global Illumination, GI)系统
全局光照(GI)系统这个概念指的是:既要考虑场景中来自光源的直接光照,又要考虑经光在其他物体表面反射后的间接光照
![](https://i-blog.csdnimg.cn/blog_migrate/37d8231251272c4828975f5ea688a19b.png)
在光线追踪技术成熟之前,全局光照往往无法应用于实时渲染,因为它的渲染成本实在是太高了,现在确实有不少相关的实时算法,但是这些就不在本次文章的范畴之内了
若考虑到离线,最简单的情况就是:场景在运行时是完全静态的的,光源也是,这时我们就可以提前计算出光照结果并保存到光照贴图中,在游戏运行时直接应用就好,尽管它有以下的局限性:
- 场景中其它移动的物体(例如玩家)不可反射间接光到其它物体上,反之亦然
- 无法展现镜面反射,因为这取决于摄像机视角
- 用于烘焙的光源属性不可改变,也不会拿来在 Shader 中参与计算
- 光照贴图的体量往往不会小,因为场景一般都比较复杂
可以对上述的情况进行优化,最经典的技术就是光照探针(Light Probes),这些 Unity 当然都支持
二、光照模式
留意其中的 Mode 属性,因为这直接决定了光源参不参与烘培
- Baked:参与烘焙,但是此光源在运行时属性不可改变,无法实时更新、变换、以及打开关闭,也无法参与计算,可以理解为设置了 Baked 的光源仅被用于烘焙,运行时无开销,可以当作不存在
- Realtime:实时光照,和 Baked 正好相反,它不会参与烘焙,可以配合动态 GI,也可以参与计算以得到更真实的实时阴影等
- Mixed:最为复杂的一种,可同时照亮静态和动态游戏对象,支持烘培,游戏中也可改变其属性
对于 Mixed Mode,它还拥有以下的额外设置(Windows → Rendering → Lighting → Scene):
这个后面再提,可以默认为 Baked Indirect
2.1 光源资源管理器(Light Explorer)
可以通过 Windows → Rendering → Light Explorer 打开光照资源管理器:它可以统一管理当前激活的光源
使用面板顶部的四个选项卡可以查看当前场景中的光源(Lights)、反射探针(Reflection Probes)、光照探针(Light Probes)和静态发射(Static Emissives)的设置,可编辑的参数都是每种组件类型最常用的字段
2.2 实时光与混合光
LightMode 设置为 Realtime 就为实时光照,实时光照 = 实时光源 + 实时 GI
实时光照与实时 GI 结合使用的缺点:
- 由于需要使用额外的一组低分辨率实时光照贴图来存储由 Enlighten 光照系统计算的实时间接反弹光线,因此增加了内存需求
- 由于需要采样额外的一组实时光照贴图并使用探针来存储由 Enlighten 光照系统计算的实时间接反弹光线,因此增加了着色器计算需求
- 间接光照会随着时间的推移而收敛,因此属性变化不能太突然
总结:实时光源会为场景提供实时的间接光照以及直接光照,非常适合光源会缓慢变化并且对场景具有很高的视觉影响(例如在天空中移动的太阳,或者在封闭的走廊中缓慢闪烁的光源)的情况,对于快速变化的光源或对于特殊效果,不建议使用,这样实在是太耗了
LightMode 设置为 Mixed 就为混合光照,一般情况下:混合光照 = 实时光源 + 烘焙 GI
三、场景烘焙流程
3.1 Generate Lightmap UVs 设置
通常烘培 Lightmap 需要用到 UV2 通道作为采样 Lightmap 的坐标,如果没有 UV2 则将使用 UV1,但使用 UV1 可能会得到不正确的光照信息
可以选择你需要烘焙的静态物体模型,勾选 Generate Lightmap UVs 选项,这可使得 Unity 生成 Lightmap 所需的 UV2
3.2 留意光照贴图属性
紧接着可以留意一下 Windows → Rendering → Lighting 中关于光照贴图的设置,暂时只需要关心这几个属性,前三个属性决定着光照贴图的质量
- Lightmap Resolution:贴图分辨率
- Direct Samples:直接光采样次数(仅 Progressive)
- Indirect Samples:间接光采样次数,同上如果采样次数过少,则会出现“花屏”的效果(仅 Progressive),这对于 Unity 自带的球体尤为明显
- Lightmapper:可切换为启发式(Enlighten)或者渐进式(Progressive),后者以增量方式生成光照贴图,优先考虑场景视图中可见的内容,可以默认为 Enlighten,但需要注意的是,如果你的 Unity 版本在 2021.1 之后,则只能采用渐进式方案
- Directional Mode:光照贴图模式,可设置为定向(Directional)或者非定向(Non-Directional),若设置为 Directional,光照贴图存储有关光照环境的信息量将多于 Non-Directional,但是这些关于入射光的额外数据可以更好地计算出射光,也就是材质在屏幕上呈现的外观将更加真实,代价就是增加了纹理内存使用量和着色时间
想要在场景中预览 Lightmap,只需修改场景可视化模式为 Baked Lightmap 即可
3.3 Lightmap Static 属性
最关键的一步:找到游戏对象的 Mesh Renderer 或 Terrain 相关组件:其中
- Lightmap Static:告知 Unity 这些游戏对象不会移动和变化,当这个属性启用时,Unity 就会将它们添加到光照贴图中
- Scale In Lightmap:进一步调整光照贴图的分辨率
- 光照贴图接缝缝合(Stitch Seams):对于单个游戏物体靠近在一起但彼此分开的网格面,它们会被识别为单独个体,因此对于当前光源环境处理不好的话两个网格之间会出现硬边缘,开启之后 Unity 就会执行额外计算来修改光照贴图,从而改善每个接缝的外观
对于静态物体,Lightmap Static 默认是被勾选的,不过静态物体在运行时是固定的,位置不可以被移动
3.4 生成光照贴图
完事之后,就可以通过 Windows → Rendering → Lighting → Scene 最下方的 Generate Lighting 生成光照贴图了,也可以勾选旁边的自动,当然这需要花些时间,注意右下角的进度条
成功之后,Unity 就会自动向 Assets 文件夹中添加光照数据、烘焙光照贴图和反射探针等资源,如果你勾选了 Auto Generate 自动生成光照贴图,那么这个文件夹就不可见
也可以在 Mesh Renderer 或者 Terrain 相关组件找到其对应的 Lightmap,或者是 Windows → Rendering → Lighting 选择 Bakes Lightmaps 找到其对应的网格 UV 图表
四、烘焙结果预览
先考虑最简单的情况:只保留平行光并设置其为烘焙光,关闭环境光照,所有的着色器使用内置的 Standard
![](https://i-blog.csdnimg.cn/blog_migrate/e41d257024b9effd29c1a239777ec628.png)
如果一些物体带有自发光,使用光照烘焙当然也可以得到一个非常不错的效果
4.1 小心透明物体
透明物体的烘焙可能会出现错误的结果,这是因为光照烘焙系统并不知道这个物体是透明的
想要解决这个问题也很简单。先检查 Cast Shadows 属性:
紧接着告诉光照烘焙系统这是透明物体:
- Asset / Create / Lightmap Parameters 创建光照贴图参数
- 勾上 IsTansparent 属性
- 在透明物体的 Mesh 组件上选择对应的 Lightmap Parameters
将对象标记为透明也会更改它对间接照明的贡献,透明的物体会让间接光通过,而不透明的物体会阻挡它
4.2 启用环境光遮蔽
- Max Distance:光线在终止前被跟踪的距离值
- Indirect:控制 AO 对间接光的影响程度,滑动条值设置得越高,场景的折痕、孔和近表面被间接光照射时的外观就越暗,一般情况下仅将 AO 应用于间接光照
- Direct:控制 AO 对直射光的影响程度,滑动条值设置得越高,场景的折痕、孔和近表面被直射光照射时的外观就越暗
参考文章: