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”和“多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最佳实践-场景照明相关推荐
- Unity最佳实践-物理计算
Unity最佳实践-物理计算 英文原文:https://unity3d.com/cn/learn/tutorials/topics/physics/physics-best-practices 层次( ...
- 京东云分布式链路追踪在金融场景的最佳实践
微服务是近几年最流行的软件架构设计理念,和容器.devops一起构成了云原生的技术基础.微服务源于对产品快速交付的市场诉求,通过采取一系列的自动化测试.持续集成等敏捷开发实践,激活了组织效率,也增强了 ...
- 阿里云研发工程师刘睿:阿里云消息生态及最佳实践
2022 年 9 月 24 日,阿里云用户组(AUG)第 12 期活动在厦门举办.活动现场,阿里云消息中间件研发工程师刘睿,向参会企业代表分享了阿里云消息生态及最佳实践.本文根据演讲内容整理而成. 众 ...
- arcore之路-unity开发从入门到实践_Unity游戏开发——单例模式的最佳实践
0.前言 StarryFun:Unity游戏开发--关于单例模式的理解zhuanlan.zhihu.com 之前一篇文章讲了单例模式的简单理解,自知其中有很多不严谨的地方,由于本萌新也是在学习阶段, ...
- 选型最佳实践|从业务场景分析直播SDK
摘要 近两年即时通讯/直播产品炙手可热,市场上针对ToB的产品日益增多,企业该如何去选型呢?本文分享了笔者对于直播产品的思考,将从直播SDK实例功能特性.常见业务场景.注意事项及最佳实践等方面介绍如何 ...
- 没有场景,不做单点技术输出,360数科如何做金融科技的最佳实践?
作者 | Just 出品 | AI科技大本营(ID:rgznai100) 从互联网金融公司转变为金融科技公司,品牌升级后的360数科强化了"科技"的外衣. 在近期的首个360数科技 ...
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...
- 最佳实践丨三种典型场景下的云上虚拟IDC(私有池)选购指南
简介:业务上云常态化,业务在云上资源的选购.弹性交付.自助化成为大趋势.不同行业的不同客户,业务发展阶段不一样,云上资源的成本投入在业务整体成本占比也不一样,最小化成本投入.最大化业务收益始终是不同客 ...
- 一朵云、一张网、一体化 ——GRTN 打造最佳流媒体场景实践
简介:阿里云的流媒体云原生平台 " 阿里巴巴 GRTN 是面向流媒体云原生设计的,方便客户构建自己的流媒体云原生应用,让流媒体服务无处不在. " 在近期召开的分布式云主题报告会上, ...
最新文章
- 软件行业项目经理主要的职责是什么?(转)
- python生成词云很慢吗_词云制作没那么难,Python 10 行代码就实现了!
- mysql query cache优化
- 计算机应用基础白雪梅,白雪|
- C++复习笔记--继承和派生
- Repeater在无数据记录时显示“无相关记录...”
- 洪磊父亲避谈洪磊获释 拘留已过24小时留滞期
- permutation 1(HDU-6628)
- android beaglebone,Android Based Beaglebone Spybot
- python读取坐标文本文件_使用python读取txt坐标文件生成挖空矿山_探矿批量
- 纯CSS打造淘宝导航菜单栏
- 各种开发语言项目环境国内(中国国内加速镜像)配置教程和部分实践经验,包括github.com, nodejs,npm,nvm, yarn, java, maven, gradle, python, m
- Flink案例代码,面试题
- Lick the habit 戒除恶习
- HTML期末大作业课程设计~仿阴阳师游戏官网首页html模板(HTML+CSS)~动漫主题html5网页模板-HTML期末作业课程设计期末大作业动漫主题html5网页模板-html5网页设计源码...
- Ubuntu完全教程
- 心理测评软件的心理测试法的优缺点,心理测试的优缺点
- 问题 L: 鸭子唱歌
- 永善县黄华镇大永高速通车了
- 深度学习网络各种激活函数 Sigmoid、Tanh、ReLU、Leaky_ReLU、SiLU、Mish
热门文章
- 干货! 快速上手typescript的学习笔记 (对比JS的新特性,环境搭建,webpack配置,ts编译配置)
- 数据库-Orcal基础(一)
- Python编程-- BS4解析
- 为什么用scrum_为什么幼儿园的老师是最好的Scrum大师。
- 记dwz(JUI)前端框架使用(一)
- [sd card] SD card初始化时的总线设置
- 《绿皮书》获奥斯卡最佳影片奖 阿里影业等联合出品
- java cmd进入目录_cmd命令大全 进入目录
- 科学计算机显示math,Math在科学计算器上代表什么怎样才能在计算器上显示?
- 分布式应用(Dubbo)