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”和“多Scene”:参见下文的 多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的两种方式
Application.LoadLevelAdditive(string name);
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使用了相同的光照设置,并且要遵守全局设置。

Unity最佳实践-场景照明相关推荐

  1. Unity最佳实践-物理计算

    Unity最佳实践-物理计算 英文原文:https://unity3d.com/cn/learn/tutorials/topics/physics/physics-best-practices 层次( ...

  2. 京东云分布式链路追踪在金融场景的最佳实践

    微服务是近几年最流行的软件架构设计理念,和容器.devops一起构成了云原生的技术基础.微服务源于对产品快速交付的市场诉求,通过采取一系列的自动化测试.持续集成等敏捷开发实践,激活了组织效率,也增强了 ...

  3. 阿里云研发工程师刘睿:阿里云消息生态及最佳实践

    2022 年 9 月 24 日,阿里云用户组(AUG)第 12 期活动在厦门举办.活动现场,阿里云消息中间件研发工程师刘睿,向参会企业代表分享了阿里云消息生态及最佳实践.本文根据演讲内容整理而成. 众 ...

  4. arcore之路-unity开发从入门到实践_Unity游戏开发——单例模式的最佳实践

    0.前言 StarryFun:Unity游戏开发--关于单例模式的理解​zhuanlan.zhihu.com 之前一篇文章讲了单例模式的简单理解,自知其中有很多不严谨的地方,由于本萌新也是在学习阶段, ...

  5. 选型最佳实践|从业务场景分析直播SDK

    摘要 近两年即时通讯/直播产品炙手可热,市场上针对ToB的产品日益增多,企业该如何去选型呢?本文分享了笔者对于直播产品的思考,将从直播SDK实例功能特性.常见业务场景.注意事项及最佳实践等方面介绍如何 ...

  6. 没有场景,不做单点技术输出,360数科如何做金融科技的最佳实践?

    作者 | Just 出品 | AI科技大本营(ID:rgznai100) 从互联网金融公司转变为金融科技公司,品牌升级后的360数科强化了"科技"的外衣. 在近期的首个360数科技 ...

  7. atitit.人脸识别的应用场景and使用最佳实践 java .net php

    atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...

  8. 最佳实践丨三种典型场景下的云上虚拟IDC(私有池)选购指南

    简介:业务上云常态化,业务在云上资源的选购.弹性交付.自助化成为大趋势.不同行业的不同客户,业务发展阶段不一样,云上资源的成本投入在业务整体成本占比也不一样,最小化成本投入.最大化业务收益始终是不同客 ...

  9. 一朵云、一张网、一体化 ——GRTN 打造最佳流媒体场景实践

    简介:阿里云的流媒体云原生平台 " 阿里巴巴 GRTN 是面向流媒体云原生设计的,方便客户构建自己的流媒体云原生应用,让流媒体服务无处不在. " 在近期召开的分布式云主题报告会上, ...

最新文章

  1. 软件行业项目经理主要的职责是什么?(转)
  2. python生成词云很慢吗_词云制作没那么难,Python 10 行代码就实现了!
  3. mysql query cache优化
  4. 计算机应用基础白雪梅,白雪|
  5. C++复习笔记--继承和派生
  6. Repeater在无数据记录时显示“无相关记录...”
  7. 洪磊父亲避谈洪磊获释 拘留已过24小时留滞期
  8. permutation 1(HDU-6628)
  9. android beaglebone,Android Based Beaglebone Spybot
  10. python读取坐标文本文件_使用python读取txt坐标文件生成挖空矿山_探矿批量
  11. 纯CSS打造淘宝导航菜单栏
  12. 各种开发语言项目环境国内(中国国内加速镜像)配置教程和部分实践经验,包括github.com, nodejs,npm,nvm, yarn, java, maven, gradle, python, m
  13. Flink案例代码,面试题
  14. Lick the habit 戒除恶习
  15. HTML期末大作业课程设计~仿阴阳师游戏官网首页html模板(HTML+CSS)~动漫主题html5网页模板-HTML期末作业课程设计期末大作业动漫主题html5网页模板-html5网页设计源码...
  16. Ubuntu完全教程
  17. 心理测评软件的心理测试法的优缺点,心理测试的优缺点
  18. 问题 L: 鸭子唱歌
  19. 永善县黄华镇大永高速通车了
  20. 深度学习网络各种激活函数 Sigmoid、Tanh、ReLU、Leaky_ReLU、SiLU、Mish

热门文章

  1. 干货! 快速上手typescript的学习笔记 (对比JS的新特性,环境搭建,webpack配置,ts编译配置)
  2. 数据库-Orcal基础(一)
  3. Python编程-- BS4解析
  4. 为什么用scrum_为什么幼儿园的老师是最好的Scrum大师。
  5. 记dwz(JUI)前端框架使用(一)
  6. [sd card] SD card初始化时的总线设置
  7. 《绿皮书》获奥斯卡最佳影片奖 阿里影业等联合出品
  8. java cmd进入目录_cmd命令大全 进入目录
  9. 科学计算机显示math,Math在科学计算器上代表什么怎样才能在计算器上显示?
  10. 分布式应用(Dubbo)