【Unity3D技术文档翻译】第3.6.1.1 使用预计算光照
上一章:【Unity3D技术文档翻译】第3.6.1篇 Enlighten概述
本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Global Illumination】→【Enlighten】→【Using precomputed lighting】
使用预计算光照
在 Unity 中,预计算光照无论是在自动处理还是手动开启,都是在后台进行计算。不管在哪种方式下,它们都是在场景之后处理,因此可以继续在编辑器中工作。
当在进行预计算处理时,一个蓝色进度条将出现在编辑器的右下角。根据 Baked GI(烘焙GI)和 Precomputed Realtime GI(预计算实时GI)的开启情况,会有不同的阶段需要被完成。关于当前正在处理的信息,会被展示在进度条上方。
进度条展示了 Unity 当前预计算的状态。通过上面的例子我们能看到,预计算正处于11分之5的进度,当前任务的名字叫“Clustering(聚集)”,并且正在向第6个任务移动,总共还有6个任务等待完成。不同处理系统的阶段任务如下所示:
Precomputed Realtime GI(预计算实时GI)
- Create Geometry(创建几何体)
- Layout Systems(布局系统)
- Create Systems(创建系统)
- Create Atlas(创建图集)
- Clustering(聚集)
- Visibility(可见性)
- Light Transport(灯光传播)
- Tetrahedralize Probes(四面体探针)
- Create ProbeSet(创建探针配置)
Probes(探针)
- Ambient Probes(环境光探针)
- Baked/Realtime Ref. Probes(烘焙/实时参考探针)
Baked GI(烘焙GI)
- Create Geometry(创建几何体)
- Atlassing(图集处理)
- Create Baked Systems(创建烘焙系统)
- Baked Resources(烘焙资源)
- Bake AO(烘焙环境光遮蔽贴图)
- Export Baked Texture(导出烘焙纹理)
- Bake Visibility(烘焙可见性)
- Bake Direct(烘焙直接光)
- Ambient and Emissive(环境光与自发光)
- Create Bake Systems(创建烘焙系统)
- Bake Runtime(烘焙运行时)
- Upsampling Visibility(向上采样可见性)
- Bake Indirect(烘焙间接光)
- Final Gather(最终收集器)
- Bake ProbesSet(烘焙探针配置)
- Compositing(合成)
开始一个预计算
只有静态几何体会被 Unity 的预计算光照解决方案考虑。为了开始光照预计算处理,我们需要场景中至少有一个游戏对象被标记为“static”。为了做到这点,既可以手动一个个设置,也可以按住 shift 键从层级面板(hierarchy panel)中选中多个游戏对象。
在检查器面板(Inspector panel)中,Static 复选框可被勾选(Inspector > Static)。而如果勾选了,将会设置游戏对象的所有“static options(静态选项)”,包括 navigation(导航) 和 batching(批处理),而这可能并不是我们想要的。对于 Precomputed Realtime GI(预计算实时GI),只需要“Lightmap Static”选项被勾选就够了。
想要更深入地进行控制,static options(静态选项)下拉列表中的每个选项都可被设置。此外,还可以在 lighting window 中的 Object 区域将物体设为 Static。
如果你将场景设置为 Auto Generate(自动生成光照贴图)(Window > Lighting > Settings > Scene > Auto Generate),Unity 的光照预计算将自动开启,并且当场景中的任何静态几何体发生变化,它都会自动更新。如果你没有开始 Auto Generate,你就必须手动开启光照预计算。
自动/手动 预计算
如果你已经在 Lighting 面板中勾选了 Auto Generate,那么无论你场景中的静态几何体什么时候发生变化,预计算将在后台自动开始处理。
然而,如果你没有开启 Auto Generate,你就必须通过点击旁边的“Build”按钮来来动开启光照预计算。这种开启方式和自动开启差不多,并且你可以控制什么时候开启。
在较小的、不太复杂的场景中,开启 Auto Generate 很有用。因为当你移动或者编辑了场景中的静态对象时,它将快速地生成精确的光照结果。然而,在较大的、复杂的场景中,你可能更想手动控制,如此一来,每当你更改场景时,电脑的CPU就不会被大量占用,也不用重复地自动开启光照预计算。
当你手动开启一个预计算,场景光照的所有方面都将被评估和计算。如果想要重新单独计算和烘焙 Reflection Probes(反射探针),那么可以点击下拉菜单中的 Bake Reflection Probes 选项。
注意:当使用 Auto Generate 模式,Unity 会将你的光照数据存储在一个有限大小的临时缓存中。这意味着,当你的光照数据超过了缓存的大小,Unity 将删除旧的光照数据。如果你的一些场景依赖于自动生成的光照数据,而它们又刚好被删除了,那么就可能发生问题。在这种情况下,你的场景在构建项目时,就可能产生错误的光照。因此,在构建你的游戏前,你应该取消 Auto Generate,然后为你的所有场景手动生成光照数据。Unity 接着将你的光照数据保存为资源文件,放在你的项目文件夹中,这意味着你保存的数据成为了你项目的一部分,并被包含在构建中。
开启 Baked GI 或 Realtime GI
Unity 默认开启了 Baked GI(烘焙GI)和 Realtime GI(实时GI)。Baked GI(烘焙GI)都是预计算的;Realtime GI(实时GI)在使用间接光照时执行一些预计算。两种都开启后,你可以控制每个灯光使用哪种GI系统(在 Light 组件中,通过 Mode 属性来设置)。想了解更多信息,请看 Lighting window(光照设置窗口)和 Global Illumination(全局光照概述) 两节。
使用光照系统的最灵活的方式是 Baked GI(烘焙GI)和 Realtime GI(实时GI)一起使用。然而,这也是性能负荷最大的做法。如果你的游戏对资源占用敏感,你可以选择关闭 Baked GI(烘焙GI)或 Realtime GI(实时GI)。注意,这么做将减少光照系统的灵活性和功能性。
想要手动开启或关闭全局光照,需要先打开 Lighting 窗口(Window > Lighting > Settings > Scene)。勾选 Realtime Global Illumination 选项来开启 Realtime GI;勾选 Baked Global Illumination 选项来开启 Baked GI。取消勾选这两个复选框,即可以关闭相应的 GI 系统。如果任何灯光开启了一个被你关闭的模式,那么将覆盖你的设置,并激活相应 GI 系统。
Light 组件设置
想要设置每个灯光的属性,需要在场景(Scene)或者层级(Hierarchy)窗口选中它,然后在检查器(Inspector)窗口中编辑 Light 组件的属性。
对于每个灯光,默认 Mode 都是 Dynamic(动态)。这意味着灯光生成了场景中的直接光照,而 Unity 的 Realtime GI 则负责处理间接光照。
如果你将灯光的 Mode 设置为 Static(静态),那么灯光生成的光照将被用于 Unity 的 Baked GI 系统。并且无论是直接光还是间接光,都将被烘焙进光照贴图,且在游戏中不能被改变。
如果你将灯光的 Mode 设置为 Stationary,被标记为 Static 的游戏对象仍然将光照包含在它们的 Baked GI 光照贴图中。然而,与被标记为 Static 的灯光不同,被标记为 Stationary 的灯光仍然能产生实时光照。如果你在静态环境中使用了光照贴图,但是仍然想要一个良好的动态光照和静态光照贴图几何体之间的交互,就可以使用该模式。
(奇怪的是,上面提到的 “Dynamic”、“Static”、“Stationary” 模式,无论是在最新的编辑器(Unity 2018)中,还是在后面的文档中都没有被提及,而是仍然使用所谓旧版的 “Realtime”、“Mixed”、“Baked” 模式,后面的文档也会对这三个模式做详细介绍。)
途中灯光模式被设置为 **Dynamic**。GI 缓存
无论使用 Baked GI(烘焙GI) 还是 Precomputed Realtime GI(预计算实时GI),Unity 都会将和你场景光照有关的数据保存到 “GI Cache” 中,并且将在预计算期间尝试复用这些数据以节省时间。你对场景做出改变的数量和性质,决定了这些数据有多少会被复用。
该缓存被存储在 Unity 项目之外,可以通过 Preference > GI Cache > Clear Cache 选项被清除。清除这些数据意味着,预计算的所有阶段都将需要从头重新计算,而这会占用一些时间。然而在有些时候,你可能需要减少硬盘占用,那么这么做能起到一些帮助。
用于 baked GI 的 LOD
当 Unity 在生成烘焙光照贴图时,有时候需要 Level-of-detail(细节层次,简称 LOD)。直接光照是使用所有 LODs 的实际表面进行计算。而低层级的 LOD 使用 light probes(光照探针)来获取间接光照。最终的光照会被烘焙进光照贴图。
这意味着,你应该将 light probes(光照探针) 布置在 LODs 周围来捕捉间接光照。如果你全部使用的是 baked GI,那么游戏对象将不会在运行时使用 light probes(光照探针)。
如果本文对你有帮助的话,点个赞或者评论一下吧!