Unity最佳实践-场景照明
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
当在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使用了相同的光照设置,并且要遵守全局设置。