UNITY光照系统简介
UNITY_光照系统
光照系统又称照明系统;
从字面意思理解,光照系统的作用就是给我们的场景带来光源,用于照亮场景。一个五彩缤纷的游戏场景肯定要比一个漆黑一片的游戏场景更具吸引力,想让游戏场景变的更漂亮,光照系统是必不可缺的。
在 Unity5.x 中光照系统主要组成部分有两个:
灯光组件(4 个灯光组件,2 个特殊功能组件)以及 Lighting 面板。
两种类型:
- 实时光照:PC,主机端运行,照明效果好,但是消耗资源较大。
- 烘焙光照:移动端运行,照明效果也不错,消耗资源较少。
光照系统之实时光照
实时光照全称为 Precomputed Realtime GI(预先计算的实时全局光照);
GI 全称是 Global illumination(全局光照);
Unity5.x 光照系统默认使用的就是实时光照类型。
光照结论:
- 所有的灯光都真实的参与运算,可以动态的改变任何的灯光(位置,颜色,强度....),且随着改变,灯光对场景环境的影响也是实时的。
- 所有的场景环境模型,也同样是真实的参与运算,这些场景模型也是真实的受到各种光源的影响。
- 综合结论:光源真实的影响环境,环境真实的受光源影响。
Lighting面板相关设置:
- Ambient GI:显示当前光照系统的模式(实时还是烘焙)。
- Auto 复选框的作用:默认是勾选状态,也就意味着我们场景里面添加了新的模型,改变了原有模型的位置,场景灯光是会自动计算的。场景内资源模型较少时,可以勾选,但是如果场景很复杂了,就要取消这个 Auto 的勾选状态,否则你每次调整了场景中模型,都要重头Build 一次,是很消耗时间的。
- Build 按钮的作用:场景实时光照,烘焙光照的相关光照数据的“构造生成”。前面的 Auto 选项就是控制这些相关数据,是自动还是手动生成。
光照系统之烘焙光照
烘焙光照全称为 Baked GI(烘焙全局光照);
烘焙光照的特点是将场景中的光源信息事先烘焙为“光照贴图”,用这些贴图存储光照,然后引擎会自动的将这些“光照贴图”与场景模型相匹配,烘焙完光照贴图后,在游戏运行过程中场景内的灯光是不会真正的参与实时运算的。烘焙光照相对于实时光照,对硬件的性能要求较低,这种光照方式比较适合手机等移动设备平台(灯光组件的实时运算,是特别消耗硬件性能的)。现在的手机端,特指 Android 设备。上面的 MMORPG 游戏场景的光照90%以上的都是使用的烘焙光照。
烘焙步骤:
- Lighting 面板选择要使用的光照系统模式,并取消 Auto 选择状态。
- 所有参与烘焙的光源,自身的灯光组件中的 Baking 选项要设置为 Baked。默认是 Realtime,这个 Baking 根据当前场景的要使用的光照系统的模式进行选择和设置。
- 所有参与烘焙的场景模型物体,自身要设置为 Static,设置完毕后,这些物体就变成了静态物体,场景运行后,是无法改变它们的位置的。
- 完成了前面的操作,就可以点击 Lighting 面板下方的“Build”按钮,进行光照贴图的烘焙生成。
光照贴图:存储了场景中的灯光信息,“Build”完毕后,会以资源的形式出现在项目工程目录中,和当前场景处于同一目录,且生成一个该场景同名的文件夹,存储相关光照贴图。
烘焙光照步骤细节
- Lighting 面板选择模式为 Baked GI;
- 相关灯光设置为 Baked;
- 相关模型设置为 static;
场景模型为何要静态?
因为只有静态的模型,才能参与烘焙渲染,烘焙渲染是要生成光照贴图的。生成的光照贴图和场景模型是一一对应的。贴图是固定的,如果你的模型是非静态的,就表示模型可以移动,模型动了的话,光照贴图就偏了。为了避免这样的情况,Unity 引擎只允许静态的模型参与光照烘焙过程。
烘焙光照重点参数
- Baked Resolution [重点调整参数]
烘焙分辨率:其实就是生成的光照贴图的分辨率。值越大,效果越好,体积也就越大,烘焙时间也就越长,反之亦然。这个参数是最最影响烘焙时间的。
一般在开发阶段,不要设置太高,否则需要很长的时间来渲染光照贴图。
阶段测试,最终发布的时候,设置高一点,渲染一个最佳的效果即可。
- Baked Padding [默认即可]
烘焙间距:控制烘焙出来的光照贴图,贴图元素信息之间的间距。无实际意义,保持默认的 2 即可。
- Compressed [默认即可]
压缩:对烘焙的贴图进行压缩,压缩比例大约是 3~5 倍。意义重大,保持默认的勾选状态。
- Ambient Occlusion [根据实际情况选择是否开启]
AO 贴图效果:作用和标准着色器里面的 AO 贴图类似,都是用于优化模型的阴影和转角部分。
- Atlas Size [默认即可]
图集尺寸:单张光照贴图的最大尺寸。
光照系统之灯光探头组
烘焙光照后的问题
在使用 Unity 开发移动平台的应用(游戏,VR,AR)时,为了保障应用的的运行帧率,我们一般将场景中最消耗资源的“实时光”烘焙成“光照贴图”。光照贴图保存了场景中所有的静态物体的光照效果,但是场景中的非静态物体,比如:游戏角色,NPC,这些能动的角色,它们身上就不会出现光照效果。那么如何解决这个问题那??
Unity 为了应对这种情况,推出了一个专门解决该问题的组件:“Light Probe Group”:灯光探头组。
灯光探头组
组件作用:
使用灯光探头组组件,我们可以在烘焙后的场景中,模拟实时光照状态下的效果。
组件使用步骤:
- Light --> Light Probe Group 添加组件;
- 点击组件上的 Edit 按钮,在正交视图下添加新的“探头”,并调整位置。
组件注意事项
摆放“探头”要让探头成为一个“体积”,我们的角色在整个空间内移动的时候,无论移动到任何地方,都处于一个“体积”内,也就是说触发 4 个探头。
组件的原理分析
在空间内摆放 N 个灯光探头,成一个体积状态。然后烘焙光照贴图,在烘焙光照贴图的同时,也会烘焙这些灯光探头,这些探头会记录下当前自己所在位置的灯光信息。然后当我们的非静态角色模型,进入到探头的范围内,角色模型会自动获取自己周围的探头上记录的光照信息,进行插值运算后,在角色模型身上模拟出真实光照的效果。
辅助烘焙光源
区域光组件
Area Light:区域光[组件]。
区域光在“实时光照”模式下是无效的,仅在“烘焙光照”模式下有 用。
模型自发光:
标准着色器上的自发光选项,也是可以让模型成为一个辅助烘焙光源。
注意事项:
- 烘焙模式下的自发光物体也需要设置为静态。
- Emission 后的值越大,自发光强度也就越大。
光照系统之烘焙反射探头
反射探头
Reflection Probe:反射探头 组件。
反射探头的作用是用于模拟场景中反射效果的。场景中的一些高反射的物体,比如:非常平滑高亮的金属,玻璃,塑料等,这些物体都是可以反射周围的环境的,比如我们之前课程里面的测试效果。这些物体能反射显示出哪些东西,则是由反射探头决定的;Unity 新建的场景里面默认是存在一个反射探头的。
反射探头的创建
Light-->Reflection Probe //创建一个新的反射探头
组件分析:
- 反射探头这个组件由一个“立方体空间”和一个“反射探头”组成;
- 反射探头配合 Lighting 面板,同样分实时模式和烘焙模式;
- 立方体的大小我们是可以调整的,反射探头的位置同样是可以调整的;
- 如果反射探头的类型设置为了 Baked 后,则该反射探头只会反射周围的静态物体。
- 所有处于该立方体空间内的模型,只要它们的金属度平滑度比较高,就会出现反射效果,这个反射效果其实就是取的反射探头的数据;
- 环境中默认存在的反射探头,是无限大的,和天空盒是完全重叠的;
- 反射探头是可以单独烘焙的。
反射探头参数
- Type[类型]:设置当前反射探头是烘焙类型还是实时类型。
- Box Projection[盒模型投影]:很关键的一个参数,但是目前不方便测试,后续的案例中重点演示。
- Box Size[空间大小]:设置立方体空间的尺寸。
- Box Offset[空间偏移]:设置立方体空间的整体的偏移。
- Resolution[分辨率]:烘焙后的反射探头其实会输出一张贴图到我们的项目中,这个分辨率就是设置这张贴图的分辨率的,分辨率越高,反射效果越清晰,反之亦然。
- Clipping Planes[裁剪面(反射范围)]:反射探头会反射该范围内的物体。
光照系统之实时反射探头
使用步骤
- 将 Lighting 面板中的 Baked GI 取消勾选状态;
- 场景中创建一个 Reflection Probe,类型设置为 Realtime;
- 创建参与反射的模型物体以及角色;
- 对实时反射探头的组件属性进行调整;
Refresh Mode[刷新模式]
- On Awake:只在唤醒的时候刷新一次;
- Every frame:每一帧都刷新一次;
- Via Scripting:通过脚本控制刷新频率;
取消实时反射探头反射角色本身
- 给当前的角色设置一个 Layer 层;
- 然后设置反射探头上的 Culling Mask 属性将角色所在的层排除;
控制反射探头与角色位置同步
代码实现位置同步,将角色的位置同步给实时反射探头。
本作品由繁星陨辰采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。