光照最佳实践

首发:
https://
huozk.com/2019/lighting
bestpractices.html

优化场景照明并不是一门精确的科学;优化的过程通常取决于项目的风格选择。因此,本文档只提供了许多不同的方法,而不是一个推荐的优化工作流程。

0×01 场景照明

优化场景照明并不是一门精确的科学 – 这个过程通常取决于项目的艺术风格。创建令人愉悦的氛围有很多部分,它可以在很大程度上取决于项目及其独特的架构,包括项目是否使用单场景,多场景编辑还是付加加载。因此,本文提供了许多不同的方法,而不是一个推荐的工作流程。以下各部分内容特别就这一问题提出了很好的建议:

  • 自动生成和手动生成光照数据
  • 光照设置
  • 多场景编辑

当开始一个新项目时,应用以下设置以正确使用多个场景并实现光滑的光照工作流程:

  • 仅对单个场景启用 自动生成
    (请参阅下一节“自动生成和生成光照” )。
  • 不要将已启用 “自动生成”
    的场景与禁用 ”自动生成”
    的场景混合使用。
  • 无论是使用多场景编辑还是付加加载,都要确保一起使用的场景具有相同的光照设置,重点是全局设置。

如果有兴趣在Unity中制作出色的视觉效果,可以参阅 Unity 最佳实践指南中的制作可信视觉效果。

0×02 自动生成和手动生成光照数据

自动生成光照数据

Unity 在所有新场景中默认启用

“自动生成(Auto Generate)”


。要禁用 “自动生成(Auto Generate)”
,请转到 “照明设置”
(菜单: “Window” > “Lighting” > “Settings”
)窗口,向下滚动并取消选中的 “自动生成(Auto Generate)”
复选框。

当启用 自动生成(Auto Generate)
并且场景使用 烘焙的全局光照(Baked GI) 或 预计算实时全局光照(Precomputed Realtime GI) 时,Unity 会在编辑场景时重新构建光照数据。这意味着每当场景中的元素以影响烘焙数据的方式发生更改时,后台就会运行; 例如,从场景中删除静态 GameObject 会触发烘焙。

只有在处理单个场景快速迭代光照时,才应该启用 “自动生成”
。在所有其他情况下,应该禁用 “自动生成”
并手动生成光照数据。

手动生成光照数据

禁用 “自动生成(Auto Generate)”
后,可以通过单击 ”生成光照(Generate Lighting)”
按钮生成光照数据。此按钮可在 “自动生成(Auto Generate)”
复选框旁边的 ”照明设置(Lighting)”
窗口中找到。

光照数据资源

单击 “生成光照(Generate Lighting)”
按钮时,Unity 将在项目中创建光照数据资源。此光照数据资源包含场景的 GI 数据,以及 Unity 用于为场景创建照明的支持数据。光照数据资源与场景相关联。

使用 “自动生成(Auto Generate)”
时,Unity 不会在项目中创建光照数据资源。相反,Unity 将该场景的 GI 数据和其他光照数据存储在内存中。这有两个原因:

  • 在内存中更改数据要比将数据写入文件快得多。
  • 对光照数据资源进行更改会将该资源关联的 场景(Scene) 标记混乱,从而触发Unity重新序列化该场景。 自动生成(Auto Generate)
    旨在促进快速迭代,因此每次运行时都不会触发这些资源密集型操作。

在播放模式下使用自动生成的光照数据测试场景

在播放模式下测试场景时,磁盘上缺少光照数据资源可能会导致问题。简而言之,具有自动生成的光照数据的场景仅在播放模式下显示所有正确的 GI 数据,具体情况如下:
场景1:

  • 在编辑模式下,打开一个场景进行单场景编辑
  • 立即从只在编辑模式下编辑该场景转换到只在播放模式下测试该场景

场景2:

  • 在编辑模式下,将打开一组场景以进行多场景编辑
  • 立即从编辑模式中的一组场景编辑过渡到在播放模式下测试该组场景

任何其他情况都会导致使用自动生成光照数据的场景在播放模式出现明显错误。直接以实时光照(例如,Skybox 或环境源数据)继续运行,但缺少 GI 效果。

播放模式下自动生成的光照数据的问题

在播放模式下卸载场景

如上所述,在播放模式下使用自动生成的光照数据测试单个场景或场景集合时,Unity 会在卸载场景时丢失这些场景的 GI 数据。
这是因为当 Unity 进入具有自动生成光照场景的播放模式时,会将 GI 数据直接附加到该场景中的GameObjects。当Unity卸载场景时,它会破坏 GI 数据和 GameObjects。由于磁盘上没有光照数据资源可供 Unity 重新加载的 GI 数据,因此 Unity 无法在不返回编辑模式的情况下恢复此数据。这意味着如果 Unity 在同一个播放模式会话中再次加载相同的场景,则场景就会在没有 GI 的情况下显示。

在播放模式下加载其他场景

当打开单个场景并在编辑模式下启用 自动生成
时,Unity 会从其 GI 缓存(如果可用)加载该场景的 GI 数据,或为该场景生成新的 GI 数据。此 GI 数据与场景所需的其他光照数据一起驻留在存储器中,并在进入播放模式时与场景正确关联。
当 Unity 在播放模式下加载一个使用用户脚本自动生成的场景时,它的 GI 数据并不驻留在内存中。如果非附加加载场景,这显然是错误的。如果额外加载场景,效果可能更微妙,原因可能不是很明显。

多场景编辑

在启用 “自动生成(Auto Generate)”
的情况下打开多个场景进行编辑时,Unity 会将此特定场景组合的光照数据存储在内存中。
想测试这种特定的场景组合(通过立即进入播放模式),就可以使用此方法快速迭代这些场景的光照。当场景打开进入播放模式时,Unity 不需要从磁盘加载任何状态,因为所有场景元素已经附加了 GI 数据。
但是,如果要在播放模式下测试场景的不同组合,或者以不同的方式加载这些相同的场景(例如,先加载场景a,然后再加载场景b和场景c),将会出现问题。在播放模式下不立即打开任何具有自动生成光照的场景都不会有GI数据。

0×03 光照设置

光照窗口(Lighting)
(进入菜单: Window > Lighting > Settings
)包含控制光照的各种选项。

“光照窗口(Lighting)” 的 “场景(Scene)”
选项允许将光照选项设置应用于特定的场景,而不是整个项目。这些被称为场景光照设置。当 Unity 打开多个场景时,可能会出现意外的光照效果,并且这些场景具有不同的场景光照设置。在编辑模式下进行多场景编辑,或者在编辑模式,播放模式或构建的项目中加载场景时,都可能会发生这种情况。
当处理多个场景光照设置时,Unity 可以毫无问题地组合一些设置,但必须完全覆盖或合并其他设置。了解哪些光照设置不受影响,哪些光照设置被覆盖以及合并,哪些光照设置对于照亮多个场景至关重要。

  • 全局设置
    是 Unity 在加载多个场景时合并或覆盖的设置。
  • 场景相关设置
    是 Unity 加载多个场景时不受影响的设置。

全局设置

以下为全局设置:

  • “环境(Environment)” 部分中的所有设置
  • 实时全局照明(Realtime Lighting)
  • 混合照明(Mixed Lighting)
  • 照明模式(Lighting Mode)
  • 定向模式(Directional Mode)
  • 间接强度(Indirect Intensity)
  • 反射率提高(Albedo Boost)
  • “其他设置(Other Settings)”部分中的所有设置
  • 自动生成(Auto Gemerate)

使用多场景编辑或附加加载时请仔细考虑这些。当多个场景打开,并且这些场景具有冲突的全局设置时,Unity会合并或覆盖这些设置。这可能会导致意外的光照效果。因此,Unity 在播放模式下同时加载的场景应使用相同的全局设置。

打开多个场景时, 首先加载的场景
Unity 的全局设置将成为默认的全局设置。这些默认的全局设置是任何后续加载场景的基本设置,然后 Unity 会添加或合并数据。这将持续存在到,将另一个场景设置为活动(active)(通过破坏性地加载另一个场景或通过调用
SceneManager.SetActiveScene()

)。此时,活动场景的全局设置将成为默认设置。
Unit 加载的任何新场景都会将其 GI 数据合并到现有场景中。例如,场景 a 具有白天天空盒,场景 b 具有夜间天空盒。如果首先加载场景 a,然后加载场景 b,Unity 将使用白天的天空盒。
涉及实时全局光照的场景会特别复杂。为了扩展上面的例子,假设场景 a(带有白天天空盒)和场景b(带有夜间天空盒)都使用实时 GI。如果首先加载场景 a 然后加载场景 b,则场景 b 正确合并新环境光并在日光条件下显示。但是,如果场景 a 禁用了实时 GI,则添加结果是日光环境,场景 b 仍然显示烘焙的夜间结果。

实时全局照明设置也是全局设置。如果在场景中禁用 实时全局照明(Realtime GIobal Illumination)
,并且在生成其照明时添加另一个启用了 实时 GI 的
场景,则只在可能的情况下使用烘焙的结果。同样,当活动场景没有启用 方向模式(Directional mode) 时,方向模式的效果也会消失。方向模式需要一个额外的纹理,如果在活动场景中禁用了该模式,则会解除它。

场景相关设置

可以适当地组合特定的光照设置。以下设置取决于场景,并且在成功烘焙后不会影响其他场景:

  • Progressive Lightmapper 的所有设置
  • 光照贴图分辨率(Lightmap Resolution)
  • 光照贴图(Lightmap Padding)
  • 光照贴图大小(Lightmap Size)
  • 压缩光照贴图(Compress Lightmap)
  • 环境光遮蔽(Ambient Occlusion)
  • 最终聚集(Final Gather)

例如,Unity将一个光照贴图大小为1024的场景与一个光照贴图大小为512的场景安全地结合在一起。这是因为烘焙后的光照贴图分辨率不再相关,因为结果是Unity运行时使用的纹理。如果要使用不同分辨率的光照贴图,可能需要检查光照贴图 切换工具

请注意,如果在编辑器中打开了多个场景,则 “光照设置(Lighting)” 检查器仅显示 “主” 场景的设置 – 即Unity 首先加载的场景,或随后设置为活动场景的场景。

0×04 多场景编辑

使用多场景编辑时,请确保所有单个场景的灯光设置与组合的灯光设置相匹配。
即使在编辑器中加载多个场景,Unity 也会在项目中创建一个单一的光照数据资源。加载多个场景时,光照数据资源包含每个场景的一个光照数据资源。在 “项目(Project)” 窗口中,展开组合的 “光照数据资源(Lighting Data Asset)” 容器,以查看每个场景引用的单个 “光照数据资源”。
即使使用多场景编辑,编辑器也会显示一组统一的光照设置,这可能会引起混淆。每个场景都保留其设置,编辑器仅显示合并的所有场景的结果。在编辑器或播放模式下单独加载每个场景可能会显示它们具有不同的设置。在播放模式或编辑模式下更改加载顺序或使另一个场景处于活动状态可能会突然导致不同的整体外观。

注意:
“光照设置(Lighting Settings)” 还包括 “自动生成(Auto Generate)” 设置。单击 “生成光照(Generate Lighting)”
按钮以触发多场景烘焙。如果场景是实际的驱动程序,Unity 仅加载此烘焙的结果。如果额外加载的场景在其照明设置中启用了 自动生成
,则会影响 GI。单独加载此场景或在播放模式中将场景设置为活动状态会导致所有 GI 消失。

-EOF-