Unity最佳实践-场景照明

发表于2018-05-10
评论1 8.4k浏览

Unity场景照明

英文原文:https://unity3d.com/cn/learn/tutorials/topics/best-practices/auto-generate-and-generate-lighting

自动生成光照数据和手动生成光照数据

自动生成光照数据(Auto Generate)

新建Scene是默认开启了自动生成光照,可以在 Window-Lighting-Settings 页面的最下方取消对自动生成光照的勾选。 
当Scene启用了自动生成光照并且使用了 Baked Global Illumination (GI) 或者 Precomputed Realtime GI 时,编辑Scene中与光照数据相关的对象后Unity就会在后台重新烘培光照数据。 
仅当在Scene单独工作并且快速迭代测试该Scene的光照时开启自动生成光照数据,其他情况下都应该关闭自动生成并且手动生成光照数据。

生成光照(Generate Lighting)

当关闭了自动生成光照数据后,可以通过点击 Generate Lighting 按钮生成光照数据。该按钮在 Window-Lighting-Settings 页面的最下方。

光照数据资源(Light Data Asset)

点击 Generate Lighting 按钮后,Unity会在项目的与Scene同名的文件夹中创建 LightData 文件,该文件包含了Scene的GI数据。 
当使用自动生成光照数据时,Unity不会在项目中创建LightingData文件,而是把光照数据存放在内存中。

在Play模式中测试开启了自动生成光照数据的Scene

在Play模式测试Scene时,如果磁盘上缺少LightingData将会导致问题。简单地说,仅当满足下列条件之一时,开启了自动生成光照数据的Scene才能正确的显示全部的GI数据:

条件一:

  • 一个单独的Scene在Edit模式中进行单Scene编辑。
  • 在Edit模式中编辑后直接进入到Play模式中进行测试。

条件二:

  • 一个Scene集合在Edit模式中进行多Scene编辑。
  • 在Edit模式中编辑后直接进入到Play模式中进行测试。

在其他的所有情形下,开启了自动生成光照数据的Scene都会在Play模式中出现明显的错误。直接光照和实时光照(例如天空盒和环境光源数据)会正常运作,但GI效果则会丢失。

关于“直接进入到Play模式”:原文中使用了immediately一词。当在一个Scene中点击Play按钮进入Play模式时,这个Scene是直接进入到Play模式的;当一个Scene是通过脚本中的LoadScene或LoadLevel方法加载时,它不是直接进入到Play模式的。下同。 
关于“单Scene”和“多Scen”:参见下文的 多Scene编辑

在Play模式中自动生成的光照数据所含有的问题

在Play模式中卸载Scene

当开启了自动生成光照数据的单个Scene或Scene集合在Play模式进行如上所述的测试时,卸载Scene时这些Scene的GI数据会丢失。 
这是因为,当启用自动生成光照数据的Scene进入Play模式时,Unity会直接将GI数据附加到该Scene中的GameObject上。当Unity卸载Scene时,GI数据会随着其中的GameObject一起被销毁。而磁盘中又没有可以供Unity重新加载的GI数据,在不返回到Edit模式的情况下,Unity没办法恢复GI数据。 
这意味着,在同一个Play模式会话中重复加载Scene或Scene集合时,他们的GI数据会丢失。

在Play模式中增量加载Scene

 // 增量加载Scene的两种方式 
  1. Application.LoadLevelAdditive(string name);
  2. SceneManager.LoadScene(string sceneName, LoadSceneMode.Additive);

当在Eidt模式中打开Scene并且开启自动生成光照数据时,Unity会从GI缓存(若可用)中为该Scene加载GI数据或者为该Scene生成新的GI数据。该GI数据与该Scene所需要的其他光照数据一同存放在内存中,并且在Scene进入Play模式时被正确的加载。 
当带有自动生成的光照数据的Scene在Play模式中通过脚本代码被加载时,它的GI数据不会在内存中常驻。如果使用非增量的形式加载Scene,那很明显将会出现错误。如果使用增量方式加载Scene,光照效果可能会变得比较微妙并且错误不会像前者那么明显。

多Scene编辑

当打开一个Scene后,将其他Scene从Project窗口拖到Hierarchy中,便可进入到多Scene编辑模式,同时编辑多个Scene。

当打开多个Scene进行编辑并且开启自动生成光照数据时,Unity会将这个特殊的组合Scene的光照数据存储在内存中。 
只要直接进入Play模式来测试这一特定的组合Scene,它们的光照迭代都会非常快速。当打开这些Scene后进入Play模式时,Unity不需要从磁盘加载任何状态数据,因为场景中的对象早已附加了GI数据。 
但是,若要在Play模式中测试其他的组合Scene或者以其他方式加载上述的组合Scene(例如,先加载Scene A,然后增量加载Scene B和Scene C),将会产生问题。所有自动生成光照数据的Scene在不直接进入Play模式的情况下都没法拥有GI数据。

光照设置

Lighting 窗口(菜单:Window-Lighting-Settings)包含了用于控制光照形式的多个选项。 
Lighting窗口的 Scene 标签页用于设置指定Scene的光照选项而不是用于整个项目的光照设置,这些选项被称为Scene光照设置。当同时打开多个具有不同的光照设置的Scene时,将会出现意料之外的光照结果。这种情况可能在使用Edit模式进行多Scene编辑时发生,也可能在Edit模式、Play模式或者编译好的工程中进行增量加载时发生。 
当同时处理多个Scene的光照设置时,Unity能够正确的将一些设置组合,但对于其他的设置内容,必须要将其完全重写或者合并。理解哪些光照设置不会受到影响、哪些光照设置会被重写以及哪些光照设置会被合并是处理多Scene光照的关键。

全局设置项(Global Settings) 是加载多个Scene时一定不会被重写或合并的设置项。 
依赖Scene的设置项(Scene-dependent Settings) 是加载多个Scene时不受影响的设置项。

全局光照设置

当打开多个Scene并且这些Scene的光照设置与全局设置冲突时,这些Scene的设置会被Unity合并或者重写。这会导致意料之外的光照结果,应该避免这种情况的发生。因此,需要通过增量加载同时使用的Scene应该使用相同的全局设置。

在使用多Scene编辑或增量加载时要仔细考虑下列设置项:

  • Environment标签中的所有设置项
  • Realtime Global Illumination
  • Mixed Lighting
  • Lighting Mode
  • Directional Mode
  • Indirect intensity
  • Albedo Boost
  • Other Settings标签中的所有设置项
  • Auto Generation

当打开多个Scene时,第一个加载的Scene 的全局设置将会成为默认的全局设置。该全局设置是之后进行增量加载的所有Scene的基础设置,这些Scene的数据必须按照全局设置进行合并或者增添。这种情形会持续存在,直到其他Scene被设置为活动(active)状态(通过非增量地加载其他Scene或者调用SceneManager.SetActiveScene()方法)。这时,活动Scene的全局设置成为新的默认设置。 
例如,Scene A使用了白天天空盒,Scene B使用了夜晚天空盒。如果先加载A然后增量加载B,这两个Scene都会使用白天天空盒。 
Unity中任何增量加载的新Scene的GI数据都会合并到已有场景的GI数据中。 
涉及到Realtime Global Illumination时的情况极其复杂。基于上面的示例,假设Scene A(使用白天天空盒)和Scene B(使用夜晚天空盒)都使用了Realtime GI。如果先加载A然后增量加载B,B可以正确的合并新的环境光并且使用白天天空。然而,如果A关闭了Realtime GI,增量加载B的结果就会是,在晴朗的白天天空下,B中的物体却显示出夜晚的光照效果(?)。

?:存疑!英文原文是“However, if Scene A has Realtime GI disabled, the additive result is a sunny environment with Scene B still showing baked night-sky results.”。

Realtime Global Illumination属于全局设置。如果在某个Scene中关闭了Realtime GI,基于该Scene进行增量加载的其他启用了Realtime GI的Scene在生成其光照时只会使用已烘培的数据(如果可用)。类似的,当活动Scene的Directional Mode没有启用时,增量加载的Scene的Directional Mode效果也会消失。Directional Mode需要额外的贴图并且在活动Scene没有启用Directional Mode时不会生效。

依赖Scene的光照设置

特定的光照设置可以进行适当的组合。下面的设置项属于依赖Scene的设置项,并且在成功烘培后不受其他Scene的影响:

  • Progressive Lightmapper中的所有设置项
  • Lightmap Resolution
  • Lightmap Padding
  • Lightmap Size
  • Compress Lightmap
  • Ambient Occlusion
  • Final Gather

例如,Unity可以将一个Lightmap大小为1024的Scene和一个Lightmap大小为512的Scene安全的进行组合。因为烘培后的Lightmap是给Unity运行时使用的,它不再与Scene相关。若要使用不同分辨率的Lightmap,可以参考Lightmap Switching Tool

请注意,如果Editor中打开了多个Scene,光照设置的Inspector只会显示“主要”Scene的设置项:例如,第一个被加载的Scene,或者后续加载的Scene中任意一个被设置为活动的Scene。

多Scene编辑

当使用多Scene编辑时,请确保每个Scene的光照设置与组合光照设置相匹配。 
即使在Editor中加载了多个Scene,Unity也只会在项目中保存一份单独的LightingData资源,当加载多个Scene时,这个LightingData中包含了每个Scene的LightingData数据。在Project窗口中可以将这个组合的LightingData文件展开,来查看每个Scene所引用的LightingData。 
在进行多Scene编辑时,Editor中会显示一个统一的光照设置数据,这可能会带来一些潜在的误解。每个Scene都会保存它自己的光照设置数据,但Editor只会显示所有Scene合并后的设置数据。在Editor或Play模式中单独加载每个Scene都可能显示出不同的设置数据。在Play模式或Edit模式中更改Scene加载顺序或者将其他Scene设置为活动状态都可能导致画面的整体视觉效果突然改变。

注意:光照设置中也包含了自动生成光照数据的设置。点击 Generate Lighting 按钮来触发多Scene的光照烘培。仅当这个Scene作为实际的驱动时Unity才会加载这个烘培结果(?)。如果一个通过增量方式加载的Scene启用了自动生成光照,这将会影响到GI,在Play模式中单独加载这个Scene或者将其设置为活动Scene将会导致GI效果消失。

?:存疑!英文原文是“Unity loads the result of this bake only if the Scene is the actual driver.”。

在开始构建项目时,遵从下列建议有助于正确的使用多Scene和实现过渡平滑的光照效果:

  • 只在Scene不与其他Scene同时使用时才启用 Auto Generate
  • 不要弄混开启了 Auto Generate 的Scene和没有开启 Auto Generate 的Scene。
  • 无论是使用多Scene编辑还是使用增量加载Scene,确保所用会一起使用的Scene使用了相同的光照设置,并且要遵守全局设置。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引