使用预计算实时全局光照优化照明-微调光照贴图参数

本文地址:https://blog.csdn.net/t163361/article/details/124107784
翻译说明:
教程翻译主要用谷歌翻译后,对特别不通顺的地方进行了微调。同时针对一些比较重要的地方保留了英语或英语和汉语同时存在的方式。

教程目录

微调光照贴图参数

中级 1 小时

摘要

在本教程中,您将了解如何使用簇(Clusters)生成全局照明打光,并使用光照贴图参数在每个对象的基础上对示例场景中的照明进行微调。

1. 概述

到目前为止,在本学习项目中,您已经从图表的角度考虑了预计算实时 GI。 减少或优化场景中图表的数量会限制预计算期间所需的光照贴图合成和打包等操作的数量。 这有利于预计算性能,是减少 Unity 预计算实时 GI 解决方案所需数据集大小的广泛方法。
修改(Clusters)是一种更细粒度的方法,可以让您减少 Unity 预计算过程中后续任务所需的操作数量。 减少簇数量的另一个好处是运行时性能也会得到提高。

2.簇介绍

在使用预计算实时 GI 生成场景的照明解决方案时,Unity 通过处理静态场景的体素化“代理”简化了所需的计算。这些体素称为簇(Clusters)。
簇(Clusters)实际上是映射到用于照明的静态几何体的表面图块(小图块)。簇存储在层次关系中,用于在预计算 Unity 的漫反射全局照明解决方案时进行复杂的辐照度计算。请注意,虽然 Clusters 的映射方式与 Charts 类似,但两者实际上是独立的
簇(Clusters)场景视图绘制模式可用于可视化 Unity 的预计算实时 GI 生成的簇(Clusters)的规模。
聚类场景视图绘制模式的图像,显​​示柔和的颜色框叠加。
簇(Clusters)如何工作?
簇(Clusters)对它们映射到的静态几何体的反照率进行采样。然后,在预计算的光传输阶段,计算这些簇(Clusters)之间的关系,以便光可以在整个簇(Clusters)网络中传播。 Unity 生成静态场景的这种低分辨率近似值,以简化在运行时需要更新的照明数据量,以便在当前硬件的限制下以交互式帧速率提供全局照明。
下图展示了簇(Cluster) X 的光照值与附近四个簇(Clusters)的值之间的关系。
四个簇排列成方形,左下角延伸出一个立方体。所有这四个簇都会影响簇 X 的光照值。
图片由 Geomerics 提供。
完成预计算后,无需重新启动预计算过程即可修改环境(天空盒)照明以及灯光位置、强度和颜色。考虑到最终输出中场景材质的底层反照率和自发光,这些光照变化将反弹并渗透到整个簇(Clusters)网络。
在此初始反弹之后,可以将更新的照明结果应用于簇(Clusters)本身。在每次迭代之后,光照簇(Clusters)将被采样到相应的光照贴图纹理中,然后最终被场景中的着色器使用。
由于此过程在 CPU 上异步执行,因此刷新全局照明解决方案所需的时间受可用工作线程数的限制。
一旦光线在整个簇(Clusters)网络中反弹,光照簇(Clusters)场景视图绘制模式就会显示簇(Clusters)。
照明簇场景视图绘制模式的图像,显​​示整个场景中的照明簇。
可视化簇
可以使用ClusteringLit Clustering场景视图绘制模式来可视化簇。使用Clustering,场景将覆盖由彩色方块组成的诊断模式。当映射到相应的静态几何图形时,每个正方形的大小表示簇的大小。每种独特的颜色代表场景中的不同簇。类似地,Lit Clustering场景视图绘制模式会显示这些簇,当光在整个簇网络中反弹并将结果写回簇后。
减少簇数量
减少簇的数量在很大程度上决定了此更新发生的速度,以及Unity的预计算实时GI在目标平台上的交互速度。更重要的是,就本教程而言,减少簇的数量将缩短预先计算照明所需的时间。因此,照明场景时的迭代速度也会提高。我们将在本教程的下一部分介绍减少簇数量的技术。

3.创建光照贴图参数资源

Unity 提供的许多高级光照贴图控制项可通过使用光照贴图参数获得。 这些设置存储在光照贴图参数资源( Lightmap Parameters asset)中。 这允许在场景和版本控制之间共享照明设置,以便在协作团队环境中共享使用。
创建光照贴图参数资源:

  1. 导航到Project窗口。
  2. 从 Project 窗口左上角的 Create 下拉菜单中,选择 Create > Lightmap Parameters
    Inspector 中新 LightmapParameters 资源的图像。

烘焙 GI 和预计算实时 GI 的高级控制项可通过光照贴图参数获得。
注意:您还可以从项目窗口中的右键菜单或顶部菜单栏(Asset > Create > Lightmap Parameters)创建光照贴图参数资源。

4.将光照贴图参数资源分配给游戏对象

创建后,可以将光照贴图参数资源分配给静态 MeshRenderer 组件:

  1. 在 Hierarchy 窗口中选择您希望分配光照贴图参数资源的游戏对象。 游戏对象必须标记为 Static 并具有 MeshRenderer 组件。
  2. 在 Inspector 窗口(Window > General > Inspector)中,展开 Lightmapping 标头。
  3. 使用Lightmap Parameters下拉菜单将光照贴图参数资源分配给游戏对象。
    Mesh Renderer 组件的 Lightmapping 折叠中的 Lightmap Parameters 属性下拉列表的图像。

Lightmap Parameters下拉菜单右侧的Editor按钮可用作修改分配给选定对象的光照贴图参数的快捷方式。
可以将相同的光照贴图参数资源分配给多个对象。为此,请在Hierarchy窗口中选择多个对象,然后按照上述步骤操作。对此光照贴图参数资源的更改将分配给选中的所有对象。

5.光照贴图参数:per-instance 还是 per-Prefab?

与展开设置类似,光照贴图参数资源可以分配给Prefab 或应用于场景中的单个游戏对象实例。 应用于场景中预制件实例的光照贴图参数资源将覆盖存储在预制件中的光照贴图参数资源。
这种方法的优点是可以将适用于大多数情况的默认光照贴图参数应用于预制件。 当需要更细粒度的控制时,可以在场景中逐个覆盖这些默认值。
在本教程中,您将选择在每个实例的基础上应用光照贴图参数资源。 这样您就可以根据使用每个游戏对象的上下文选择不同的光照贴图参数资产。

6.回顾场景默认光照贴图参数

可以配置场景范围内的默认光照贴图参数。这些默认光照贴图参数将分配给场景中尚未分配光照贴图参数资源的所有已存在的Mesh Renderers。然后在场景中创建的任何Mesh Renderers也将使用默认的光照贴图参数。使用这种方法可以减少在设置照明场景时需要执行的手动分配量。
来回顾下这些参数:

  1. 打开 Lighting 窗口(Window > Rendering > Lighting Settings)并选择 Scene 选项卡。
  2. 导航到Lightmapping Settings标头。
  3. 使用Lightmap Parameters下拉菜单将光照贴图参数资源分配给场景。

在 Lighting Settings 窗口的 Lightmapping settings 部分中,Lightmap Parameters 属性下拉菜单的图像设置为 Default-Medium。
光照贴图参数将分配给场景中所有新创建的静态网格体渲染。请注意,尽管此光照贴图参数将应用于所有新创建的对象,但仍可以通过将高级参数分配给对象来覆盖单个对象,如上所述。
预设光照贴图参数
Unity 提供了许多预设的光照贴图参数来帮助快速设置场景光照。这些都是:

  • Default - HighResolution
  • Default - Medium
  • Default - LowResolution
  • Default - VeryLowResolution

分配这些光照贴图参数之一将配置许多设置,这些设置确定所选对象的整体照明成本。这些设置包括光照贴图分辨率、全局照明参数和簇分辨率,以及其他高级的逐对象设置。在尝试平衡整个场景的照明性能时,这些都是重要因素。

7.光照贴图参数:Resolution和Cluster Resolution

Unity 的默认参数旨在涵盖许多常见用例,并且通常足以满足许多照明场景。通过创建您自己的光照贴图参数资产,可以实现对预计算实时 GI 系统的更细粒度的控制。
光照贴图参数的 Unity 手册页面提供了光照贴图参数资源中包含的所有设置的概述。但是,在本教程中,我们将重点关注对照明优化最有用的设置。
Resolution(分辨率)
Resolution值确定使用此光照贴图参数的对象所需的光照贴图分辨率。分辨率是针对在Lighting窗口的Scene选项卡中指定的场景范围的间接分辨率使用的乘数。
例如,如果场景的 Indirect Resolution 设置为 2,Resolution 属性设置为 0.5,则分配了此 Lightmap 参数的任何对象将在生成的光照贴图纹理中使用每单位 1 个纹素。
由于预计算实时 GI 仅表示场景中的漫反射、间接照明,因此您不需要使用传统烘焙光照贴图方法所需的分辨率。预计算实时 GI 所需的光照贴图分辨率通常最多为每单位 2-3 纹素,而不是传统光照贴图中可能使用的每单位 20-30 纹素。在大多数情况下,特别是对于大型户外物体(例如地形),该值可能还要低很多倍。在这里,低至每单位 0.1 纹素的光照贴图分辨率可以提供足够的细节。
使用高分辨率光照贴图时的斑驳伪影可以通过增加辐照度预算值来缓解。
图像显示物体上斑驳的人工制品。
请记住,当使用非常高的光照贴图分辨率时,在较低分辨率下不明显的伪影可能会成为问题。这些伪影可能在生成的光照贴图纹理中显示为斑驳或模糊的光照。如果发生这种情况,增加光照贴图参数中的辐照度预算通常可以减少此类问题的出现。
Cluster Resolution(簇分辨率)
Cluster Resolution指定可以容纳在预计算实时 GI 光照贴图的纹素内的簇数量。
例如,如果簇分辨率设置为最大值 1,则光照贴图中的每个纹素将有 1 个簇。簇分辨率值为 0.5 意味着只有 0.5 个簇适合光照贴图纹素。换句话说,簇将是光照贴图纹素大小的两倍。
进一步扩展这个想法,想象这个场景的全局间接分辨率设置为 1。您创建一个大小为 1x1x1 单位的立方体,然后将光照贴图参数资源分配给该对象。如果光照贴​​图参数资源指定分辨率为 1 且簇分辨率为 1,则立方体的每一侧将有 1 个簇。
如果您随后将分辨率提高到 2,结果将是立方体每一侧 2x(1x1) 个簇,即 4 (2x2) 个簇。
图像显示场景中的 1x1x1 单位立方体,间接分辨率为 1。分配的光照贴图参数指定簇分辨率为 1 Cluster per texel。因此,当光照贴图分辨率为每单位 2 个纹素时,每个面将有 4 个簇。
在大多数情况下,簇分辨率只需要是光照贴图纹素大小的一小部分。例如,Unity 附带的 Default - HighResolution Lightmap Parameters 资源的簇分辨率为 0.6。
场景中的大量簇会迅速增加预计算时间并降低运行时场景全局照明的交互性。因此,您必须确保使用更多簇可以为光照贴图输出的质量带来一些切实的好处。如果您可以使用更少的簇而不会对光照贴图产生不利影响,那么这始终是优先的。
分辨率、簇分辨率和场景范围的间接分辨率
将光照贴图的分辨率和簇分辨率指定为比率意味着您可以与场景范围的间接分辨率属性值建立相对关系。您可以将 Lighting 窗口中定义的 Indirect Resolution 用作整个场景的高级分辨率值。然后,您将能够使用光照贴图参数对单个对象或对象组进行细粒度控制。
Unity 采用这种分层方法,以便为您提供更多的全局控制。如果需要为分辨率和簇分辨率指定一个绝对值,如果您想修改整体光照分辨率,则必须手动重新配置项目中的每个光照贴图参数。

8.光照贴图参数:Irradiance Budget和Irradiance Quality

Irradiance Budget(辐照度预算)
在本学习体验的前面部分,您探索了 Unity 如何通过使用簇生成场景静态几何体的近似值来计算预计算实时 GI。在预计算期间,计算这些簇之间的关系,以便光可以在整个分层网络中快速传播。
本质上,光照贴图纹素的值是通过从纹素的位置获取场景簇的“视图”来确定的。这意味着您可以快速计算簇之间的光的反弹,以创建全局照明效果。然后可以在最终渲染之前将这些簇采样到光照贴图中。
Irradiance Budget决定了在对簇网络进行采样时每个光照贴图纹素使用的内存量。这决定了照明结果的精度(准确度)。较低的辐照度预算意味着在记录此场景视图时每个纹素使用较少的内存。这会在运行时减少内存使用和降低 CPU 成本,但代价是照明保真度。较低的辐照度预算将导致较低频率(模糊)的照明结果。相比之下,较高的辐照度预算将提供更准确的 GI,但会增加内存使用量和运行时额外的 CPU 开销。
如果您的预计算实时 GI 在运行时更新不够快(滞后),降低辐照度预算可能会有所帮助。这最适用于高保真照明的优势可能不那么明显的物体,例如大的、模糊的或遥远的几何体。
Irradiance Quality(辐照度质量)
在预计算期间生成预计算实时 GI 光照贴图时,每个光照贴图纹素都会将光线发射到场景中,以报告附近簇的可见性。然后计算纹素可以看到的每个簇的百分比。当确定可见簇对光照贴图中每个纹素的光照贡献时,会使用此值。Irradiance Quality指定纹理像素在此过程中能够发射的光线数量。
在物体与其周围环境的光照条件不准确匹配的情况下,您应该考虑提高辐照度质量。有时会出现光照贴图纹素具有意外明亮结果的情况。这可能是因为没有足够的光线投射到场景中,因此可能会遮挡光照贴图纹素的簇被遗漏了。同样,可能没有检测到较亮的簇。在这里,光照贴图结果会出乎意料地变暗。
发射更多的光线会增加报告周围簇的准确表示的可能性。这些对光照贴图输出准确性的改进是以增加预计算时间为代价的。要优化预计算时间,您应该使用获得所需照明结果所需的最低辐照度质量。请注意,此值不会影响运行时性能。

9.光照贴图参数:Backface Tolerance和Modeling Tolerance

Backface Tolerance(背面容差)
从场景簇收集光照时,从光照贴图纹素发射的光线有时会击中背面几何体。生成全局照明时,您只关心从对世界可见的面反射的光。来自背面几何体的光始终被认为是无效的。这些背面撞击有可能破坏或以其他方式使照明结果无效。修改背面容差是防止此类情况发生的一种方法。
在此示例图像中,地板上的深色光照贴图纹素是由 Unity 光能传递计算期间无效的背面命中创建的。增加背面容差设置可以解决此问题。
图像显示了由于无效的背面命中而具有深色光照贴图纹素的一堆砖块。
背面容差指定必须来自正面几何体的光的百分比,以便将纹素视为有效。如果光照贴​​图纹素未能通过此测试,Unity 将使用相邻纹素的值来近似正确的光照结果。
修改背面容差不会影响您的预计算实时 GI 的优化。更改此值不会对预计算的长度或运行时性能产生很大影响。然而,在增加辐照度预算但仍然存在错误的深色或浅色纹素的情况下,背面容差作为故障排除工具很有用。
Modelling Tolerance(模型容差)
不需要的伪影(例如黑色光晕)有时会出现在场景中静态几何体中存在小间隙的区域。这尤其可能发生在附近有相反几何形状的区域,例如地板上的物体。
诸如此示例图像中的暗边伪影通常可以通过增加模型容差来修复。
图像显示了三个带有深色边缘伪影的桶状物体。
在这些情况下,物体和相对表面之间有一个小间隙,很少或根本没有光可以进入。很暗的纹素可能会记录在下面的光照贴图中。在较低的光照贴图分辨率下,暗纹素的大小可能意味着它们超出了遮挡对象的边界,并可能导致一些不需要的黑边。在照明环境中,这些小物体创建的阴影值可能是不需要的或被视为噪声。
模型容差用于忽略小于阈值的细节。增加此值将确保 Unity 的 GI 计算忽略存在于另一个表面附近的几何体部分。较高的值将强制预计算的 Light Transport 环节忽略小于光照贴图纹素此百分比的间隙。减小模型容差可确保 GI 计算仍然考虑较小的对象。
模型容差不会影响预计算实时 GI 的优化。它不会对预计算时间或运行时性能产生负面影响。但是,您可以在对不需要的视觉伪影进行故障排除时使用它。如果在增加其他值(例如辐照度预算或辐照度质量)的情况下仍然存在伪影时,模型容差可能很有用。

10.构建你的光照贴图参数资产

现在您已经探索了各种光照贴图参数设置在功能方面提供的功能,是时候通过构建您自己的光照贴图参数资产并在教程场景中使用它们来开始应用这些知识了。
要构建光照贴图参数资源:

  1. 打开 LightingTutorialStart 场景。
  2. 在 Project 窗口中,导航到文件夹 Assets > LightmapParameters。
  3. 在 Project 窗口的左上角,选择 Create > Lightmap Parameters
  4. 将这个新创建的光照贴图参数资源命名为 TutorialTerrainLow。

你能把它分配给什么? MountainPeak 游戏对象的规模非常大,并且远离相机。 这是选择场景默认值以外的光照贴图参数的好例子。
显示场景视图中的两个 MountainPeak 游戏对象的图像

11.将光照贴图参数资源分配给对象

接下来,您将将此光照贴图参数资源分配给场景中的对象:

  1. 在 Scene 视图中,选择离可玩区域最近的两个山地游戏对象。这些都被命名为MountainPeak。(您现在将忽略最远的山。)
  2. 使用 Inspector 面板,检查两个 MountainPeak 游戏对象的静态属性是否已启用。
  3. 打开 Lighting 窗口(Window > Rendering > Lighting Settings),然后选择 Scene 选项卡。
  4. 检查是否启用了Auto Generate设置。
  5. 现在选择两个 MountainPeak 游戏对象。
  6. Lightmap Parameters 下拉菜单中,选择新创建的 TutorialTerrainLow光照贴图参数资源。这会将光照贴图参数资源分配给选定的游戏对象。
  7. 选择 Lightmap Parameters 下拉菜单右侧的 Edit 开始编辑设置。

创建新光照贴图参数时显示默认设置的图像。

12.设置分辨率

您将设置的第一个参数是分辨率。降低光照贴图的分辨率可以提高预计算时间和运行时性能,因此您应该尽可能使用最低的分辨率值而不影响光照质量。
回顾分辨率
较高的光照贴图分辨率适用于近距离观察的对象,但 MountainPeak 的两个实例都离相机相对较远。其他因素表明低光照贴图分辨率在这里是合适的。这些大物体的材质反照率通常相当一致。此外,从相机的角度来看,考虑到它们的比例,这些物体接收到的光的颜色几乎没有变化。如果没有太多照明细节需要捕捉,您可以降低这些对象的光照贴图的分辨率,而不会影响结果的质量。
要对此进行回顾:

  • 尝试慢慢降低 TutorialTerrainLow 光照贴图参数资源的分辨率参数,并观察场景视图中光照贴图分辨率的变化。

对于山脉和地形等大型风景对象,默认的光照贴图分辨率会很浪费。
显示两个 MountainPeak 游戏对象的默认光照贴图分辨率的图像。
使用较低的分辨率可以大大节省预计算和运行时性能,而对照明结果的感知质量几乎没有影响。
显示两个 MountainPeak 游戏对象的光照贴图分辨率降低的图像。
请记住,分辨率值是 Lighting 窗口的 Scene 选项卡中定义的场景范围Indirect Resolution的乘数。在这个场景中,我们选择了 1 的间接分辨率。因此,如果您在光照贴图参数中选择小于 1 的分辨率值,则生成的光照贴图输出将小于每单位 1 个纹素。
设置分辨率值
MountainPeak 对象距离其他场景几何体足够远,因此它们不太可能接收到任何细节或高频照明。这意味着如果我们选择较低的分辨率,视觉损失将很小。在本教程场景中,分辨率值 0.05 足以捕捉这些对象接收到的漫反射的反射光照。

将此值输入到新创建的 TutorialTerrainLow 光照贴图参数中:

  1. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  2. 在 Inspector 面板中,将 Resolution 值设置为 0.05。

13.设置Cluster Resolution

接下来,让我们考虑Cluster Resolution(簇分辨率)值。如前所述,簇分辨率是针对为该对象生成的任何光照贴图的纹素大小的乘数。值为 1 时,单个簇的大小将与光照贴图纹素相同。较低的值将是其中的一小部分。请记住,簇本质上是用于 Unity 的预计算实时 GI 的静态场景的体素化近似。只有当这些体素的大小不足以捕捉反射到对象或从对象反射回来的光的颜色变化时,您才需要考虑更高的簇分辨率。
回顾簇分辨率
与光照贴图的分辨率类似,MountainPeak 游戏对象的簇分辨率可以大大降低。在整个场景的其余部分所需的默认分辨率下使用簇意味着需要数百个才能覆盖这种大小的对象。
考虑到 MountainPeak 的材质具有相当一致的反照率,并且对象离相机相对较远,您可以通过选择性地降低该对象的分辨率来节省大量成本。虽然照明解决方案的准确性可能与使用更高的分辨率不同,但您不太可能注意到在场景中使用对象的上下文中的任何视觉差异。
对于远离相机的非常大的物体,簇分辨率可能会相当低。
图像显示两个 MountainPeak 游戏对象上的群集分辨率值较低:各种颜色的正方形拼凑效果。
要查看簇分辨率:

  1. 在 Scene 视图的左上角,使用 Draw Mode 下拉菜单选择 Clustering
  2. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  3. 在 Inspector 中,减小 Cluster Resolution 值。观察色块的大小如何随着值的降低而增加。
  4. 或者,Lit Clustering Draw Mode 可以是一种有用的方式来评估所得到的簇近似的分辨率是否足以捕捉场景照明中存在的细节。在 Scene 视图的左上角,使用 Draw Mode 下拉菜单来选择 Lit Clustering
  5. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  6. 在 Inspector 中,减小 Cluster Resolution 值。观察视图如何随着值的变化而变化。光照簇场景视图绘制模式有助于评估您是否有足够的簇分辨率来捕捉场景中存在的光照。
    图像显示两个 MountainPeak 游戏对象上的群集分辨率值降低:棕色方块的大拼凑效果。

设置簇分辨率值
调整该值时,最好问问自己是否因使用较低的簇分辨率而遗漏了任何关键的照明细节。如果使用更高的分辨率却没有视觉上的好处,则应始终首选使用更少的簇。请记住,场景中的簇数量将对预计算的长度和运行时 GI 的交互性产生很大影响。

在本教程场景中,考虑到 MountainPeak 实例的上下文,应用0.4 的簇分辨率。要设置这个:

  1. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  2. 在 Inspector 中,将 Cluster Resolution 值设置为 0.4

在许多情况下,仅仅降低光照贴图的分辨率和簇大小就足以实现光照性能的大幅提升。但是,您也可以通过修改 Unity 辐射度计算中使用的值来进行额外的细粒度改进:辐照度预算和辐照度质量。

14.设置Irradiance Budget

首先,让我们考虑Irradiance Budget(辐照度预算)。如前所述,该值控制在计算每个光照贴图纹素的值时为其分配多少内存。出于运行时性能的考虑,您应该使用尽可能低的辐照度预算值,而不会对照明的外观产生负面影响。
如果预计算的实时 GI 显得柔和或不清晰,您可能希望增加辐照度预算。这在场景中的高对比度照明没有被准确表示的区域中尤其明显。
回顾辐照度预算
在两个MountainPeak 游戏对象的情况下,这里的光照一般都是低频的。您不需要捕捉任何斑驳或高对比度的照明,这意味着您可以将辐照度预算从其默认值 128 字节降低,而不会对我们的照明产生明显的负面影响。
要对此进行审查:

  1. 在 Scene 视图的左上角,使用 Draw Mode 下拉菜单选择 Irradiance
  2. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  3. 在 Inspector 中,减少 Irradiance Budget 值。请注意,当您减小此值时,MountainPeak 游戏对象上的光照会变得稍微柔和一些。在评估辐照度预算或质量值的变化时,间接场景视图绘制模式很有用。
    图像显示两个 MountainPeak 游戏对象上的光线较柔和。

设置辐照度预算的值
在教程场景中进行了一些实验后,我们发现将辐照度预算减半至 64 字节的值不会对照明质量产生太大影响。要设置这个:

  1. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  2. 在 Inspector 中,将 Irradiance Budget 值设置为 64

15.设置Irradiance Quality

现在让我们继续讨论Irradiance Quality(辐照度质量)。如前所述,辐照度质量决定了在计算光照贴图纹素值时每个簇发射的光线数量。与会影响运行时性能的辐照度预算不同,辐照度质量仅影响照明预计算时间。
在由于发射光线数量不足而错过小却重要的簇的情况下,提高辐照度质量可能很有用。例如,在某些情况下,您可能在生成的光照贴图中没有特征的几何图形上具有非常突出的颜色。
回顾辐照度质量
使用 MountainPeak 游戏对象,场景中物体的巨大规模意味着我们不太可能错过附近的簇。这意味着您可以通过降低辐照度质量来提高预计算性能,而不会对光照结果产生负面影响。要探索这一点:

  1. 在 Scene 视图的左上角,使用 Draw Mode 下拉菜单选择 Irradiance
  2. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  3. 在 Inspector 中,降低 Irradiance Quality的值。请注意,随着值的下降,生成的光照贴图是如何变得稍微不那么锐利的。

设置辐照度质量的值
在测试了许多结果后,我们发现 2048 条光线的辐照度质量在 GI 照明的质量和预计算时间的成本之间取得了很好的折衷。尽管精度有所损失,但整体照明效果足以满足我们对这个遥远物体的需求。要设置这个:

  1. 在 Project 窗口中,选择 TutorialTerrainLow光照贴图参数资源。
  2. 在 Inspector 中,将 Irradiance Quality 值设置为 2048

16.在整个场景中指定光照贴图参数资源

通过为远处风景配置光照贴图参数资源,您现在可以应用所学知识并为 LightingTutorialStart 场景中剩余的静态几何体创建光照参数资源。
在您开始之前,让我们回顾一下我们准备的一些关键指南和示例:
决定分类
在本学习体验的前面部分,您探讨了确定一个分类方法或“方案”来组织场景中的对象通常是一个好主意。在应用光照贴图参数资产以微调照明性能时,根据大小或与相机的接近程度等特征将场景分解为对象分组将有助于您更轻松地进行选择。
在处理 Environment游戏对象下的剩余静态对象时,寻找不同的对象分类,以便分配共享的光照贴图参数资源。例如:

  • 物体是否可能靠近可玩区域并近距离观察?在这种情况下,增加此对象的“分辨率”值可能会显着改善照明结果。
  • 物体是遥远的还是部分被遮挡的?在这里,您不太可能需要相同的分辨率值,因为视觉效果可能并不会被注意到。同样,如果一个物体的材质在反照率方面没有很大的变化,那么更高的照明分辨率可能不会带来太多好处。

分配光照贴图参数资源时不需要太细粒度。对于大多数场景,少数不同的变体就足够了。许多细微的变体很难使用,因为任何调整都需要在不同的光照贴图参数资产中多次应用。
回顾示例场景组织
在完成的教程场景 LightingTutorialOptimal 中,我们根据物体的复杂程度和所需的分辨率将场景分为以下几类:

  • RocksLow:远离相机的平滑、凸面岩石类型网格。它们的距离意味着这些对象只需要低分辨率和降低的簇分辨率。
  • RocksMedium:平滑、凸面的岩石类型网格,更靠近可玩区域和相机,因此更明显。出于这个原因,我们使用稍高的分辨率和簇分辨率,以及更高的辐照度预算和辐照度质量。
  • StructuresHigh:受益于更高的分辨率和簇分辨率的重要建筑物。因此,这需要更高的辐照度质量和辐照度预算值。
  • StructuresLow:远离相机的建筑物,只需要较低的分辨率值。
  • TerrainLow:大型、遥远的模型,例如无法从更高分辨率照明中受益的山脉。
  • TerrainPlayable:靠近相机的大型地形对象,需要平衡光照贴图分辨率,以便相机更仔细地检查。然而,对象的规模意味着较低的簇分辨率仍然是可行的。
  • TerrainVeryLow:非常遥远且部分被遮挡的地形对象,只需要很低的分辨率和簇分辨率值。这些也具有低辐照度质量和辐照度预算设置。

考虑使用默认参数
除了这些自定义光照贴图参数资产之外,在完成的教程场景 LightingTutorialOptimal 中,我们还有许多使用从Lighting 窗口的Scene选项卡中设置的默认参数的结构。这里我们使用 Unity 的标准光照贴图参数 Default-Medium
对场景中的大多数静态对象使用默认参数可减少需要执行的手动分配量。将默认参数设置为大多数对象将使用的设置通常很有用。就我们的目的而言,默认中等与每单位 1 texel 的间接分辨率结合使用,为场景中的大多数对象提供了最佳结果。
在评估场景照明时,间接场景视图绘制模式是一个有用的工具,因为它显示了您的照明结果,而不会包含对您的预计算实时 GI 没有贡献的材质或非静态对象。
显示间接场景视图绘制模式中的示例场景的图像。
以示例为指导
在决定分配和配置照明时,请使用 LightingTutorialOptimal 场景作为指南。将光照贴图参数分配给场景中剩余的静态对象应该不会花费很长时间。
当您处理这些剩余的对象时,请记住始终质疑保持较高设置是否有客观的好处。如果可以降低设置而不会对视觉输出产生负面影响,那么这将始终是可取的。
下图显示了应用了夜间照明处理的教程场景。 在我们最初的预计算之后,在生成替代照明解决方案时不需要进一步的预计算。 这对于“传统”烘焙光照贴图技术是不可能的。
显示夜间示例场景的图像:它看起来神秘而令人回味。

17.下一步

与游戏开发的许多方面一样,优化场景照明就是要在所需的视觉效果和性能成本之间找到适当的平衡。在许多情况下,为了减少预计算时间和提高运行时性能,牺牲少量的光照保真度是值得的。
概括
在本教程中,您做了:

  • 探索了如何评估场景以对预计算的实时 GI 的光照贴图分辨率做出适当的决定。
  • 了解到照明预计算中成本最高的元素之一是场景中图表的数量,并研究了一些可以减少图表数量的技术。
  • 设置高效的 Light Probes volumes 以供小型道具和碎片类物体使用。
  • 回顾了调整 Unity 的预计算实时GI 展开算法的参数如何帮助它做出关于缝合光照 UV 的更好决策,从而减少图表数量。
  • 了解了什么是簇,它们如何用于计算 Unity 中的全局光照以及它们如何影响光照性能。
  • 尝试使用光照贴图参数来微调场景中对象的分辨率和光照保真度,从而降低视觉上不太重要的对象的预计算成本。

下一步
结合使用所有这些技术,您可以在场景中以最少的预计算时间创建生产质量的照明结果。将其与快速迭代光照和实时更新 GI 的能力相结合,再加上在运行时更改反射光照的能力,您现在应该对 Unity 的预计算实时 GI 的强大功能和灵活性以及它提供的许多实时优势有了更深入的了解应用程序。
要进一步扩展您的学习,您可以查看面向 Unity 开发人员的 ARM 指南

猜你喜欢

转载自blog.csdn.net/t163361/article/details/124107784