静态对象的光照

Tutorial

intermediate

+0XP

30 mins

(9)

Unity Technologies

静态对象的光照

在本教程中,我们将讨论光照对于静态对象的重要性,以及光照贴图和全局光照的应用。

1. 概述

在为移动设备开发应用程序时,使用静态光照至关重要。静态光照在移动设备上的运行速度更快,可为用户带来更好的体验。可以通过称为烘焙的过程(在该过程中,Unity 在运行时之前执行光照计算并保存结果)保存非移动对象上的静态光照信息。

相比之下,非静态光照(如动态或实时光照)是在每一帧中计算和更新的。虽然这可以增加场景的逼真度和增强沉浸感,但其成本要高得多。因此,在使用非静态光照时,要注意在美学目标与性能之间取得平衡。

2. 光照贴图和全局光照

烘焙会生成称为光照贴图的单独纹理,它存储了有关光照效果的信息。该信息已缓存,因而不会在运行时产生额外的性能成本。在为移动平台构建应用时,应将尽可能多的信息烘焙到光照贴图中。

预烘焙的光照无法根据场景的动态方面进行调整。但是,烘焙光照包括场景中所有静态元素的全局光照,这让每个静态元素可以发出和接收间接反射光,使得光照更加逼真。

下图显示了一个完全烘焙的场景:

Unity 让烘焙光照变得极其简单。你必须事先执行以下两个步骤:

1.单击包含要切换的光源组件的游戏对象。将 Mode 设置为 MixedBaked

对于移动平台,请尽可能选择 Baked 而不是 Mixed,因为 Baked 是代价最低廉的选项。

2.将接收烘焙光照的游戏对象标记为 Static

可以向一个对象标记多个静态标记,但通常的做法是在设置中选择 Everything。当将一个对象标记为 Static 时,Unity 就知道要在烘焙过程中包括该对象。

注意:如果为某个对象启用了 Batching Static,你将无法移动该对象或对其进行动画处理。这是另一种优化,应尽可能保持开启。)

请记住,在烘焙光照时,是基于开始烘焙时处于活动状态的场景保存数据的。将生成一个与活动场景同名的文件夹。烘焙光照的所有组件和数据都存储在该文件夹中。如果你的项目使用了多个同时加载的场景,则每个场景都需要单独烘焙光照。如果调整了场景中的光照或对象,则需要重新烘焙光照才能使更改生效。下图显示了一个包含主场景光照数据的文件夹的示例。

3. 优化光照贴图

配置要烘焙的光照后,还应确保已优化烘焙光照贴图。

光照贴图的大小取决于烘焙时使用的设置。在移动平台上最好尽量减少内存使用,因此请密切注意光照贴图的大小。在下面的示例图像中,可以看到 7 个 1024x1024 像素的光照贴图。

在地图的预览中,可以看到其网格,其中突出显示了选定的网格。

Lightmapping Settings (Windows > Rendering > Lighting Settings) 中的以下选项和实际地图的大小决定了使用的内存量。

4. 光照贴图

Unity 的 Lightmapper 提供了三种不同的方法来烘焙场景中的光照:

  • Enlighten(自 Unity 2019 LTS 起弃用,但仍可使用)
  • 渐进式光照烘焙(CPU)
  • 渐进式光照烘焙(GPU)

下图显示了这些选项:

你应该在任何项目中使用其中一个渐进式光照烘焙。渐进光照贴图以增量方式创建光照贴图,因此可以节省时间。如果选择了 Prioritize View,将优先处理 Scene 视图中的区域。为场景设置光照时,Prioritize View 可加快迭代速度。

CPU 与 GPU 渐进光照贴图的主要区别在于光照贴图是由 CPU 生成还是由 GPU 生成。结果是一样的,但如果你拥有性能强大的 GPU,则渐进 GPU 可能会快得多。可在此处找到更多关于 GPU 选项的要求和设置。

5. 纹素

纹素(也称作纹理元素)是纹理贴图中的单个像素。纹素在光照贴图中光线命中某个对象的每个点处存储光照信息。可以通过计算纹素的数量来衡量烘焙光照所需的工作量。了解什么是纹素以及纹素如何影响光照质量、烘焙的计算时间、磁盘存储和 VRAM 成本非常重要。

为尽量减少所需的光照贴图数据量,应在 Lightmapping Settings 中调整每个烘焙单位的纹素数量。通过这些设置,你可以控制光照贴图,包括每个对象在烘焙中使用多少个纹素,如示例图像所示。

Lightmapping Settings 还包括一个名为 Lightmap Resolution 的选项。该选项决定了光照贴图中每个单位使用的纹素数量。

要查看场景中纹素的布局,请执行以下操作:

  • 在 Scene 视图的左上角,单击 Shading Mode 下拉选单。
  • 找到并单击 Lightmap Indices

已烘焙的对象将被置于棋盘格中。这就是烘焙光照时纹素的分布情况。

下面的屏幕截图显示了一个立方体采用不同的 Lightmap Resolution 设置时的情况。左侧图像的设置为 1,中间图像的设置为 2,右侧图像的设置为 5。

可以看到,更高的分辨率会增加所需的工作量。应从较低的 Lightmap Resolution(5 - 10 之间)开始,然后根据场景需要进行放大或缩小。增加 Lightmap Resolution 会导致每次迭代时大小大幅增加。

例如,将 Lightmap Resolution 从 15 降低到 12,可将所需的光照贴图数量从 7 个减少到 4 个,如下面的屏幕截图所示。

6. 纹素使用量

虽然可以使用 Lightmapping Settings 设置场景中的纹素数量,但你可能还想减少某些对象的纹素数量。

通过 Unity,你可以控制每个对象可以使用的纹素数量。进入对象的 Mesh Renderer (Inspector > Mesh Renderer),可以看到一个名为 Scale In Lightmap 的参数。调整该设置可更改对象在光照贴图中使用的纹素数量。

在下面的屏幕截图中,左侧是一个为每个烘焙单位获取 5 个光照信息纹素(因为 Lightmap Resolution 设置为 5)的普通对象。右侧是一个 Scale In Lightmap 设置为 0.5 的盒体:

右侧盒体的光照贴图占用的空间要远小于左侧盒体。在下面的屏幕截图中,可以看到 Mesh Renderer 组件中可用的光照贴图设置。

请尽量避免在以下元素上使用纹素:

  • 用户看不到的表面和对象。这可避免浪费内存存储更大的光照贴图,换来的却是屏幕上看不到的细节。
  • 光照变化不大的表面,如阴影中的对象或单一光线命中的对象。
  • 小或薄的对象。小或薄的对象接收的光照量不会给场景的最终渲染增色多少。

7. LOD 和光照贴图

在模型上使用细节级别 (LOD) 会影响到烘焙光照。LOD 组中只有最详细的模型会获得光照,就像它是一个静态对象一样,而该组中的其他模型都将获得动态光照。对于直接/间接光照和实时全局光照,将使用不同的光照贴图。

使用 Enlighten 光照贴图时,系统将只烘焙直接光照。要对间接光照进行采样,必须在场景中使用光照探针。

以下图像是 LOD 模型的一些示例。请注意,由于未在场景周围放置光照探针,只有第一张图像中的 LOD 0 模型获得了正确的光照。第二张图像是使用 LOD 的模型的示例,它通过光照探针获得了正确的光照。

为确保正确地对 LOD 模型进行烘焙光照处理,必须在 Static 复选框旁边的下拉菜单中将 LOD GameObject 标记为 Contribute GI

8. 总结

使用光照贴图存储静态对象的光照数据是优化 3D 美术的重要组成部分。在下一个教程中,我们将讨论光照探针如何为移动对象和具有 LOD 的对象提供更逼真的烘焙光照条件。

Complete this Tutorial