请选择 进入手机版 | 继续访问电脑版
锐亚超脑 门户 游戏频道 游戏开发 查看内容

Unity学习——预计算实时GI(全局光照)

2020-1-29 09:35| 发布者: 下沙消掉| 查看: 111| 评论: 0

摘要: 本文仅供参考和个人学习使用教程原文:预计算实时GI简介在Unity中,有两种不同的技术可用于预计算全局照明(GI)或反弹照明。即烘培GI和预计算实时GI。本教程重点介绍预计算实时GI。使用预计算实时GI时,照明预计算指 ...

本文仅供参考和个人学习使用

教程原文:


预计算实时GI简介

在Unity中,有两种不同的技术可用于预计算全局照明(GI)或反弹照明。即烘培GI和预计算实时GI。本教程重点介绍预计算实时GI。

使用预计算实时GI时,照明预计算指的是是在Unity编辑器中,计算场景中静态几何体周围的光的反弹,并将此数据存储以供运行时使用的过程。此过程减少了在运行时必须执行的照明计算的数量,从而在保持交互式帧速率的同时允许实时反射照明。

使用烘焙GI时,传统的光照贴图纹理在预计算过程中脱机生成。这些纹理将作为项目中的资产存在,并且无法在运行时更改。预计算实时GI不会以相同方式创建光照贴图资源。取而代之的是,照明数据保存为"照明数据资产",其中包含在运行时以交互方式生成和更新一组低分辨率光照贴图所需的信息。

除非对场景进行了适当的准备和优化,否则完成这些计算所花费的时间可能会过多。在本教程中,我们将学习如何为Enlighten(Unity的预计算实时GI和烘培GI解决方案的后端)优化场景,以便照明预计算只需几分钟而不是几小时。

在本文档的过程中,我们将介绍:

  • 如何为场景确定合适的照明分辨率。
  • 什么是图表以及它们如何影响我们的预先计算时间。
  • 如何开始预计算过程。
  • 使用灯探针来减少我们照明解决方案的复杂性。
  • 改善由Unity的预计算实时GI生成的自动展开的UV。
  • 什么是簇(Clusters),以及如何将其用于生成全局照明。
  • 使用“光照贴图参数”以每个对象为基础微调照明。

    一旦学习并应用了这些技术,我们便可以充分利用预计算实时GI的优势:快速的照明迭代时间,在照明过程中进行更快实验的能力以及在游戏过程中实时反射照明的能力。

    将预计算时间从数小时缩短至数分钟

    在本教程使用的“ 照明教程场景”中,使用默认的非优化设置对照明进行预计算在我们的测试机上花费了大约7.5个小时。对于如此复杂的场景,显然这是不可接受的。

默认场景:预计算耗时7.5个小时。优化场景:预计算耗时2.25分钟。



使用本教程介绍的技术进行场景准备大约30分钟之后,为获得高质量的结果,预计算时间为2.25分钟。考虑到我们可以快速迭代场景照明,而无需在游戏过程中重新计算GI和更改GI照明,因此这项技术的诱人优势显而易见。

照明优化教程项目资源:


实时分辨率

使用预计算实时GI设置场景以进行照明时,需要做出的第一个决定是确定场景的默认实时分辨率(Realtime Resolution)。实时分辨率是每个世界单位使用的实时光照贴图纹素(纹理像素)的数量。
可以在Lighting窗口中观察或设置实时分辨率,如下所示:

  • 打开Lighting窗口(Window->Lighting),然后选择Scene选项卡。
  • 通过选中“ 预计算实时GI” 复选框,确保已启用“ 预计算实时GI”
  • 观察“ 预计算实时GI” 复选框下方的“ 实时分辨率” 属性。[新版本貌似已取消,变为了Lightmapping Settings->Indirect Resolution选项?(取消预计算实时GI后该选项不可设置)]

Unity的“照明”窗口显示场景的全局实时分辨率设置


选择适当的实时分辨率
设置场景时,了解项目所需的单位比例非常重要。在您的项目中,单位可能是米,英尺或厘米。Unity单位在现实世界中没有默认的等效项,因此由用户决定单位代表什么。

在示例项目中,我们已决定一个单位等于1米。某些物理概念假设相同。例如,在Unity中,默认情况下以每秒单位表示重力。因此,假设单位等于1米,对于现实世界的游戏场景而言,这是一个不错的设置。

通常,您可以根据游戏世界的规模来确定场景的实时分辨率。例如,您的场景是否是一个很小但人烟稠密的室内环境,在反弹的灯光中会有很多变化?在这种情况下,较高的光照贴图分辨率(例如每单位2-3纹素)可能是合理的,以便捕获这种更细致或“高频”的光照。

也许您的场景是一个大型户外环境,世界范围更大。您可能拥有面积为数百甚至数千个单位的表面,并且几乎没有变来修改反射光的颜色。在这样的情况下,当将其应用于室外环境中较大且特征较少的广阔区域时,适合于捕获室内场景中复杂的照明细节的分辨率将很浪费。我们将不得不存储和更新对场景的整体外观没有多大贡献的光照贴图像素,从而浪费宝贵的CPU时间和可用内存。更重要的是,出于本教程的目的,我们将增加在光照预计算过程中必须考虑的光照贴图纹理像素的数量。这会对预计算时间产生巨大影响。

在室外环境中,对于场景中的大型对象,合适的光照贴图分辨率可能在每单位0.5 -1纹素之间,对于地形,则应在0.1-0.5纹素之间。

预计算的实时GI分辨率与传统光照图
Unity的预计算实时GI所需的“实时分辨率”值比“传统”光照贴图纹理密度小几个数量级。这是因为我们仅在这些光照贴图中捕获间接光照,并且这往往非常柔和或“低频”。使用预计算实时GI时,通常由实时阴影而不是高分辨率的光照贴图提供清晰的阴影。

使用在传统的光照贴图技术中似乎合适的值(例如,每单位30纹素)可能会导致预计算失败或无法完成。对于室内场景,更合适的值是每单位2-3纹素,对于室外环境,更合适的值是0.5-1 纹素。假设我们正在使用单位大小为1单位= 1米的人类比例场景。如果世界规模大不相同,则需要相应调整这些值。

左:场景(室内、室外、地形);右:实时分辨率(单位:纹素/单位);[假设一个人类规模的世界具有合适的值,其中1个单位代表1m]



最初设置场景的实时分辨率时,我们为场景中的静态对象指定默认分辨率。在Inspector顶部带有标记为Lightmap Static的MeshRenderer的新GameObjects将使用该值,除非进行其他修改。

除了为整个场景选择实时分辨率之外,我们还可以选择基于每个对象更改光照贴图分辨率。如果我们需要更高分辨率提供的额外保真度,则可以有选择地增加此值。通常,将最常见的分辨率设置为“场景”默认设置,然后手动对那些需要更多照明细节的对象提高分辨率的工作较少。我们将在本教程的后面部分讨论修改每个对象分辨率的方法。

设置场景的实时分辨率
如果您想继续,我们将在本页顶部链接的照明优化教程中包含的LightingTutorialStart 场景中工作。

在我们的示例场景中,我们有一个室外环境,该区域的中型地形具有相当一致的颜色。为此,每单位0.5纹素的低实时分辨率足以捕获场景中其他对象的反射光。但是,也有一些木屋。这些要详细得多。由于场景中的房屋多于地形对象,因此我们应将实时分辨率设置为适合房屋。然后,我们可以单独修改地形对象使用的分辨率。这将减少准备场景时所需的工作量。考虑到这一点,我们将使用每世界单位1纹素的值作为默认的实时分辨率。

  • 打开Lighting窗口(Window->Lighting),然后选择Scene选项卡。
  • 实时分辨率值设置为1[新版本设置Lightmapping Settings-> Indirect Resolution为1?]


假设我们已确定场景的比例尺为1个单位= 1m,这意味着Unity的预计算实时GI创建的单个光照贴图纹理像素的大小将等于1x1m。这似乎很低,但是请记住,我们仅捕获间接光。场景中的实时灯光将提供直接照明产生的清晰阴影和镜面反射。


了解图表(Charts)

在Unity的“预计算实时GI”中,“ 图表” 是一个光照贴图纹理的区域,我们将给定场景对象的光照贴图UV映射到该区域。我们可以将其视为包含影响该对象的照明图像的小瓷砖。图表由两部分组成:辐照度(照明)和方向性(编码主光线方向)。

生成预计算实时GI后,将为图表中包含的每个纹素计算照明。场景中的大量图表可能是预计算时间的最大弊端之一,因此了解图表如何工作以及如何管理它们以优化照明预先计算时间非常重要。

该图显示了最小4x4纹素尺寸的UV图表。始终将光照贴图UV钳制在图表外部的一半纹理像素内,以防止纹理过滤引起的渗色。

默认情况下,每个图表至少为4x4纹素。因此,无论世界中物体的缩放或相应的UV壳的大小如何,一张Chart至少需要16纹素。因此,例如,如果一个对象是1x1米,该对象具有1个图表,而我们的间接分辨率为1,则该对象需要16纹素。此最小尺寸使Unity可以将图表缝合在一起,以在整个几何边缘无缝照明。为了在找到和缝合对应的伙伴之前唯一地标识它,Unity至少需要沿着图表边缘的4个纹素。

请注意,实时GI不需要填充,因为在网格物体导入管道的打包阶段,Unity会钳制光照贴图UV,以在图表内提供一半纹素边框。这意味着图表可以彼此相邻,并且仍可以进行双线性插值而不会产生交叉出血,从而节省了宝贵的光照图空间。

想象一下,我们之前讨论的同一个1x1米对象,如果有50个图表。尽管它相对较小,但Unity会为该对象创建800个纹素。这证明了拥有大量图表可以快速增加纹素的数量。更多的纹素意味着更多的照明计算和更多的数据进行计算,压缩和存储。所有这些加在一起构成复杂的场景,并且可能导致冗长的预计算并降低运行时的性能。

制图不当是导致照明预计算未完成或花费时间太长的主要原因。考虑到这一点,我们减少预计算时间的许多显而易见的策略是减少场景中图表的数量。


开始预计算过程

要使用预计算实时GI生成照明解决方案,我们必须启动预计算过程。为此,我们必须在场景中至少有一个标记为"光照贴图静态"对象。

通过在Hierarchy视图中组织和分组GameObject,可以轻松快捷地选择要包含在照明预计算中的GameObject。有许多用于组织GameObjects层次结构的策略。详细讨论这些不同的策略不在本教程的讨论范围之内。但是,重要的是要了解,在场景中进行重复选择时,采用某种方案来组织GameObjects将大大提高生产率。

在我们的示例场景中,我们将GameObjects组织到一个名为Environment 的父对象下面的分类中。该组包含构成场景环境的所有可见的静态MeshRenderer。在此之下,我们具有对象子组,这些子组在大小或拓扑方面具有相似的特征。

重复选择对象时,Hierarchy中的对象分组会有所帮助。


最有效的方法是先大范围地应用照明设置,然后逐步完善细节。

(以上面图片的布局为例)

  • 选择Environment GameObject。
  • 在Inspector窗口中,选中标记为Static的框。
  • 当询问您是否还希望启用子对象的静态标志时,请选择"Yes,change children"。这样做可以确保GameObject及其子对象将收到Lightmap Static标志。然后它们将包含在照明预计算中。

    现在,我们的场景有了一些静态游戏对象,我们可以开始进行预计算了。
  • 打开Lighting窗口(Window->Lighting),然后选择Scene选项卡。
  • 确保已选中Auto Generate复选框。可以在Generate Lighting按钮旁边找到Auto Generate复选框,如果选中Auto Generate复选框,Generate Lighting按钮将显示为灰色。
  • 现在将开始预计算过程。预计算过程的进度显示在Unity编辑器的右下角,并由蓝色进度条表示。当前任务(写为x / xx)和该任务中剩余的作业数将显示在进度栏中。
  • 如果未启用Auto Generate复选框,则可以通过单击Generate Lighting按钮来手动启动该过程。在学习本教程时,建议保留“自动”模式。

进度栏显示当前任务,预计算的剩余任务和剩余作业


探针照明

我们已经了解场景中的图表数量会对预计算时间造成不利影响,因此我们可以通过选择将某些对象从预计算中完全排除,从而在照明性能上取得重大进展。这将减少生成的图表数量。作为替代方案,我们可以在这些对象上使用探针照明,这是从场景中接收间接照明的有效方法。尽管探针照明的物体不会对场景产生反弹的照明,但通常不会产生明显的影响。最适合探针照明的物体往往是较小的物体,它们无论如何对反弹的照明几乎没有影响。

什么是探针照明?

探针照明是一种用于在游戏等实时渲染应用中近似照明的快速技术。它通常用于照明游戏世界中的角色和其他非静态(动态)对象。探针照明在运行时性能非常好,并具有可以快速进行预计算的附加优势。

探针照明的工作原理是对3D空间中特定点的入射照明进行采样,并使用称为球谐函数(spherical harmonics)的数学函数在整个球体上对该信息进行编码。这些系数具有较低的存储成本,因此可以在游戏过程中快速“解压缩”,并由场景中的着色器使用以近似表面照明。在Unity中,此功能由灯探针(Light Probes) 提供。

使用探针照明存在局限性。这样的限制之一是难以在不增加这些特殊数字的顺序(大小)的情况下表示整个球形范围内的高频或斑驳的照明。不幸的是,随着精度的提高,成本迅速上升,这意味着出于性能原因,我们仅限于低阶球谐函数。

对于在世界上的一个3D位置,只有一个球形的照明表示,这一事实使探针照明不适合表示非常大的物体上的照明,因为这些物体可能会有很多照明变化。另一个限制是-当球谐函数在球体上编码值时-它们通常不适合大型平面物体或具有明显凹度的物体。请注意,如果您考虑对大型物体使用探针灯照,则Unity手册会提供有关灯探针代理体(Light Probe Proxy Volumes,LPPV)的一些信息。

尽管有这些限制,但与合适的、较小的凸形物体一起使用时,探针照明将以相对较低的成本产生令人信服的结果。在本教程的后面,我们将更深入地探讨光探针的设置和放置,但是现在,我们只需要了解可以通过选择在适当的地方使用探针照明来减少场景中的光照贴图数量。

选择用探针照明的物体

为了使我们的照明设置正常进行,将Environment组下的GameObject设置为Static在很大程度上是有用的,但在此父对象下有许多对象的照明可以用探针照明替代。清除这些对象的静态标志将意味着Unity的预计算实时GI系统不再考虑它们,因此将减少光照贴图的数量。请记住,减少场景中图表的数量是缩短预计算时间的关键。

凸起的细小碎屑物体是探头照明的理想之选


查看Unity编辑器的Hierarchy面板,让我们检查Environment GameObject的子级。如果我们专门查看在Props(道具)下找到的对象,我们会发现其中许多是小的,碎片式的对象和场景“装饰”,例如石头,水桶和木板。这些物体很多,而许多相对较小的物体将很难展开。获得无扭曲的光照贴图UV极有可能导致大量UV壳(UV shells)。更多的UV壳需要更多的图表,更多的图表意味着需要更多的光照贴图纹理进行计算,依此类推。

鉴于这些对象非常小,它们不太可能对场景中的间接照明有很大贡献。同样,它们的尺寸意味着几乎没有表面可以显示详细的灯光变化。这使得这些物体成为探针照明的最佳候选者。由于减少了我们需要存储在内存中并在着色器中解码的光照贴图的数量,不仅预计算时间会受益,而且运行时的性能也会得到改善。

  • 在Hierarchy视图中选择"Props"
  • 在Inspector面板中,取消选中Static复选框。
  • 在完成以上步骤后,选择"Yes,change children"


在这一点上,如果我们将预计算保留足够长的时间,我们最终将在Scene视图中看到照明结果。我们可能会注意到,探针灯照点亮的非静态对象的照明与其周围的对象不同,并且与场景的照明不匹配。这是因为我们尚未设置灯探针,因此这些对象将回退到场景的环境探针(Ambient Probe)。环境探针本质上是场景中的隐藏探针,用户不可见,它仅对Lighting窗口中设置的环境源采样。

该图显示了在没有光探针的情况下,非静态对象在其环境中看起来的突兀性


为了更令人信服地将非静态对象放置在光线充足的环境中,我们需要花一些时间在场景周围放置光探针,以便对全世界的间接照明进行采样。

放置光探头

非静态对象基于附近探针的接近程度来接收照明。通过将光探针之间的空间划分为四面体体积,然后检查给定的对象位于哪个四面体中,可以决定从哪个探针可以被对象读取。为了制造这些四面体,因此必须将探针放置在能够形成3D体积或笼状结构的位置。

显示光探针放置位置的场景-在编辑器中显示为亮球体

探针照明在运行时相对代价较低,并且可以快速进行预计算。但是,为了最大程度地提高性能,在放置探针时必须格外小心。尽管设置起来较快,但光探针的密集网格布置可能很浪费,因为这些探测器中有许多在本地照明条件下不会采样太多变化。为了提高效率,更好的做法是将探头以更高的密度放置在照明发生明显变化的区域附近。例如,这可能包括从光到阴影的过渡区域,或者可能是由光反射产生的强烈色彩的区域。

  • 要设置光探测器,请从GameObject菜单(GameObject -> Light -> Light Probe Group )中创建一个光探针组
  • 现在,我们将开始放置探针。在Hierarchy视图中选择新创建的“光探针组”。
  • 在Inspector面板中,从Light Probe Group组件中选择Edit Light Probes
  • 您可以在Scene视图中选择探针本身。从创建的默认多维数据集排列中,除去一个位于角落的探针之外,删除剩余所有探针。
  • 将未删除的探针放置在环境中的地形上方,然后通过按Ctrl + D (在Mac上为Cmd + D )进行复制。
  • 使用平移工具(W),将复制出的第二个探针沿Y轴向上移动,使其比第一个探针高2米。
  • 现在再次复制探针,然后将新副本移到更高的位置,也许在Y轴上再高5米。

“光探针组”组件内的“编辑光探针”按钮

创建这样的垂直排列的原因是,我们可以对从地面,头部高度周围以及空中的反弹光进行采样(物体可能离开地面是可行的)。当我们在场景中复制这些光探针以创建体时,我们要确保可玩区域中任何地方的对象都落在探针之间创建的四面体之一内。这些体显示为探针之间的洋红色线。

该图显示了光探针的位置以及在它们的位置之间组成的四面体

  • 通过按住Shift并单独单击每个探针,或通过拖动选择来选择刚刚创建的所有3个探针。
  • 复制我们创建的整个垂直链,并将其移动到场景中感兴趣的照明区域附近。

    在确定什么是照明所关注的区域时,请寻找阴影区域,或者地形材质的颜色可能发生强烈变化的区域。请记住,我们的目标是在整个场景中采样间接或反射光。为了证明增加新探针的成本是合理的,我们必须确保它采样了一些明显的照明变化。如果我们要使用光探针对具有一般或一致照明的区域进行采样,那么当通过这些探针接收物体时,我们不太可能看到太大的变化。像游戏优化的许多方面一样,我们必须确保场景中包含的每个项目都具有一定的优势。


  • 继续重复此过程,将探头以更高的密度放置在照明区域周围,直到您创建了一个稀疏的笼式布局,将可玩区域封装起来。
  • 放置探头时,请务必记住检查最底部的灯探针是否仍在地面上。


在我们的示例LightingTutorialOptimal 场景中,我们创建了两组光探针:一组用于人口稠密的村庄区域,称为VillageLightProbeGroup ,另一组用于村庄外部的稀疏不可玩区域,称为ExtentsLightProbeGroup 。第二组覆盖了游戏世界的范围,以防任何非静态MeshRenderer离开游戏区域。在场景的这些无法到达的部分中,我们不需要相同程度的保真度,因此该组的密度可以大大降低。垂直轴上两个探头就足够了。

将光探针组分成两个GameObject,可以更轻松地放置探针。在场景中工作时,可以启用或禁用单个光探针组以提供更清晰的视图。这些组将在运行时自动合并,同时执行重复数据删除操作以删除所有重叠的探针。

要看到我们的光探针根据其环境点亮效果,我们必须等待照明预计算完成。如果在Lighting窗口中启用了自动模式,则会自动发生。如果未启用自动模式,则必须通过导航到Lighting窗口(Window->Lighting)并按Generate Lighting 按钮来手动开始预计算。

完成此过程后,您会注意到场景中的非静态GameObjects现在从光探针读取,并且看起来与场景照明更好地匹配。要查看处于点亮状态的光探针,请在Hierarchy视图中取消选择Light Probe Group。

现在,我们已经在场景中设置了光探针,我们可以在较小的prop对象上获得间接照明的视觉好处,而无需花费将这些对象包含在预计算中而创建的额外图表的费用。


展开和减少图表

既然我们已经从照明预计算中排除了合适的对象,我们就可以开始减少剩余图表数量的工作。

创建的图表包含静态网格物体渲染器的UV光照贴图坐标。因此,对象所需的图表数量在很大程度上取决于解开相关对象所需的UV壳(件)的数量。展开始终是在几何图形上的纹素分布的变形与足够的纹理覆盖所需的壳数之间的权衡。

Unity复杂的展开算法通常无需我们干预即可取得良好的效果。但是,有时我们需要提供一些指导。因此,重要的是我们了解自动展开背后的理论和过程。

请考虑以下插图:

展开时不会变形,但需要多个UV壳

使用单个UV壳的UV坐标,但产生不可接受的纹理变形

理想的结果,没有纹理失真,并且只有一个UV壳

在上图中,我们显示了三个不同的示例,这些示例说明了如何投射或展开对象上的UV 。

在第一个图像中,我们可以看到一个基本上没有失真的结果。我们将用作纹理的棋盘格图案进行映射,以使纹理的每个图块在纵横比上保持正方形。如果我们以为这个棋盘格是一个光照贴图(应用于对象的光照的“图像”),我们将获得看起来正确且无失真的结果。但是,我们需要六个UV壳才能获得此覆盖范围。结果,我们将使用Unity的预计算实时GI系统获得六张图表。无论对象的大小如何,每个海图至少需要4x4像素,这意味着该对象将至少使用96像素,而与分辨率无关。

在第二张图片中,我们有不同的问题。由于投影了对象的UV纹理坐标,因此我们有一个完整的UV壳可以覆盖所有面。尽管就覆盖对象所需的图表数量而言,这是最佳选择,但视觉结果将无法接受。我们可能会在对象表面上看到纹理的“污迹(smearing)”。对象的面在UV纹理空间中也重叠-这意味着,如果我们引用光照贴图,则来自某一侧的光照将显示在相对的面上。显然,这种展开对象的方法不会给我们令人满意的结果。

第三幅图显示了理想的展开示例。我们得到的结果没有失真:棋盘格纹理的瓷砖的纵横比保持正方形。我们还成功地覆盖了对象的所有面,同时仅输出一个UV壳。这是通过连接或缝合与模型上连续几何图形边缘对应的UV边缘来实现的。

如果我们以编程方式考虑这一点,我们做了什么以实现理想的展开呢?首先,我们将UV正交投影到对象上,以创建单独的壳。然后,我们评估了这些壳的边缘,这些边缘在相应对象的几何形状中共享。在找到共边的位置,我们将这些壳移动并缝合到其相邻壳的边缘。这就是Unity的展开算法试图自动处理静态几何的方法。

可视化图表


在优化我们的展开图和光照贴图之前,我们需要一种在编辑器中可视化它们的方法。图表在网格导入管道的展开阶段生成。对于预计算实时GI,会在其预计算的几何阶段将这些图表打包为图集。这是为了确保它们不会重叠。预计算的几何阶段完成并且保存了可视化数据后,我们才能看到图表的预览。

如果您是团队中的版本控制人员,请注意,此信息在本地缓存。这意味着在各种诊断绘图模式可用之前,必须在本地计算机上执行预计算。

UV图表绘制模式将场景中使用的不同图表表示为彩色区域,将光照图分辨率表示为棋盘格叠加

快速可视化图表的一种方法是在Scene视图中使用UV图表绘制模式。

  • 在Scene视图的左上角,使用Draw Mode下拉菜单选择UV Charts


使用此模式,可以将图表视为不同颜色的面板,上面覆盖着代表相应的光照贴图分辨率的棋盘格纹理。如果启用了自动模式(Window->Lighting->Auto Generate),则会自动计算对展开参数的更改,并且将使用结果更新Scene视图。

对象Preview窗口的图表模式将图表显示为彩色正方形,将UV光照贴图显示为浅蓝色线框

使用复杂对象时,很容易在Scene视图中丢失图表。通过使用Lighting窗口中的Preview面板,我们可以查看单个对象使用的所有图表。这可以帮助我们更准确地评估这些对象的展开,这将有助于我们减少场景中的“图表”计数。

  • 打开Lighting窗口(Window->Lighting),然后选择Lightmaps选项卡,点击Open Preview
  • 在Hierarchy窗口中选择我们要查看的对象。
  • 在Preview窗口的右上角,从下拉菜单中选择UV Charts

该对象使用的图表数量将由彩色正方形表示,该正方形上覆盖有相应的浅蓝色UV坐标。

贴图展开参数说明

我们可以调整许多设置来优化UV展开。所有这些设置都是针对每个对象的。我们可以通过Mesh Renderer组件访问这些设置


Max Distance 最大距离

Unity的展开算法试图通过移动壳并将UV边缘缝合在一起来简化光照贴图UV。仅当外壳在最大距离”定义的距离内时,才考虑使用UV外壳。此范围以Unity的世界空间单位定义。请记住,在我们的教程场景中,我们假设单位是1米。

在Lighting窗口的Obect选项卡中找到“自动UV最大距离”设置;[新版本在Inspector窗口的Mesh Renderer组件中即可找到]

在许多情况下,默认值为0.5单位将给出可接受的结果。对于带有大面积表面的特别大的物体,可能需要增加该值。这是为了防止拼接算法将合适的候选UV排除在选择范围之外。

增加“最大距离”通常会减少所选对象所需的图表数量。在可见的光照贴图纹理拉伸的情况下,减小此值很有用,实际上我们可能需要更多的图表才能获得所需的纹理贴图覆盖率。使用“ UV图表场景”绘制模式下的棋盘格覆盖图,可以轻松评估这些更改的结果。找到正确的平衡通常需要进行一些试验。

Max Angle 最大角度

光照UV壳还根据相应网格的相邻面之间的角度评估照明UV壳的缝合情况。Max Angle 定义共享UV边缘的面之间允许的最大角度,并使用内角计算得出。如果背面之间的角度大于该角度,则将不考虑这些UV壳进行缝合。

在Lighting窗口的Obect选项卡中找到“自动UV最大角度”设置;[新版本在Inspector窗口的Mesh Renderer组件中即可找到]

增大此值将更有可能通过Unity的展开算法将照明UV合并。因此,“最大角度”可能是减少所选对象所需图表数量的好方法。但是,当此值太大时,有时会出现拉伸的光照贴图。减小“最大角度”将使展开器合并UV边缘的可能性降低,这将导致更多的图表但失真更少。同样,在“ UV Charts ”绘制模式下使用棋盘格覆盖是评估我们使用的值是否适合的好方法。

Preserve UVs 保留UV[新版本变为Optimize选项?]

在某些情况下,使用自动展开器可能无法获得理想的展开效果。最终,我们的光照贴图中可能会出现太多的图表或不可接受的变形(在GI图表绘制模式下可视为拉伸的方格)。在这些情况下,可能有必要在模型文件的UV01通道中手动创作UV。在我们选择的内容创建包中,需要完成此工作。

如果是这种情况,我们可以使用"Preserve UVs"选项来强制Unity的展开算法保留模型UV01通道中定义的UV壳的形状。

当需要保留手动照明UV时,“保留UV”选项很有用[新版本为取消勾选Optimize选项?]


重要的是要注意,这些壳将始终被重新包装以节省光照贴图空间。这是壳单独展开的方式,它们将被保留,而不是保留壳在光照贴图中的位置。

使用这种方法时,我们必须谨慎。如果我们的光照贴图UV包含大量UV壳,则此选项实际上会增加预计算时间。这是因为跳过了Unity自动展开器提供的UV合并步骤,并且保留了我们的手动UV布局。请记住,期望的结果是在保持可接受的失真度的同时,尽可能少地放置UV壳-因此,尽可能少地绘制图表。

Ignore Normals 忽略法线
在某些情况下,网格导入器可能会决定拆分几何体。这也会影响图表。例如,如果网格具有非常多的三角形数,则Unity将其拆分为单独的子网格之后的性能可能更高。通常这是针对硬件的特定要求,例如减少每个绘图调用中的三角形数量。根据相邻网格面(例如硬边)之间的法线角度存在较大差异的区域来确定发生这些分开的位置。以这种方式划分网格会在模型的网格导入过程中发生。在此过程中,图表可能会被拆分,因为落在图表内的边缘可能会分开,从而导致多个外壳,进而需要更多的图表。

忽略法线复选框可防止在导入管道期间拆分图表

有时不希望以这种方式拆分图表。图表数量的最终增加可能不利于预计算时间,并且接缝会在最终的光照图中导致不必要的视觉伪像。在这些情况下,启用Ignore Normals 忽略法线复选框将防止为预计算实时GI照明拆分图表。

请注意,只有预计算实时GI受此选项影响。所选网格中的分割情况仍保留用于Unity中的其他用途。

在较大的场景中更快的迭代

复杂场景可以包含数百甚至数千个静态对象。为所有这些对象生成图表图集可能会导致缓慢的光照预计算,并且可能会对我们能够在场景上进行迭代的速度产生负面影响。

在尝试对对象进行展开设置时,有时在空的场景中隔离所关注的对象很有用,在该场景中我们可以用最少的预计算时间快速进行迭代。然后,可以将我们确定的展开设置记录并应用于原始场景中的该类型的其他对象。以这种方式进行工作可以在为照明准备场景时节省大量时间。

  • 打开示例项目中包含的LightingTutorialStart 场景。
  • 在Hierarchy窗口中选择一个名为HouseBig02 的对象。这些分组在Environment->Structures->Houses
  • 通过按Ctrl + C (在Mac上为Cmd + C )将此对象复制到剪贴板。
  • 通过按Ctrl + N (在Mac上为Cmd + N )来创建新场景。
  • 如果提示您保存更改,如果对当前的场景进度感到满意,请选择“ 是”,否则,请选择“ 否”
  • 在新创建的场景中,通过按Ctrl + V (在Mac上为Cmd + V )从剪贴板粘贴HouseBig02
  • 打开“照明”窗口(Window->Lighting),然后选择Scene选项卡。
  • 通过启用Auto Generate复选框来启用自动预计算模式。

(以下部分在新版本中,替换为直接在Inspector中查看即可;后文同理,不再赘述)

  • 现在选择Object选项卡。
  • 在“对象”选项卡的左上方,从下拉菜单中选择Charting
  • 展开Preview区域以查看对象如何展开。

优化Unity的自动展开

配置展开参数时,理想的结果是找到一个值的组合,以使图表数量最少,同时光照贴图的失真最小。请记住,启用“ UV Charts”绘制模式时,贴图失真情况将可视化为、应用于Scene视图中对象的棋盘格纹理的拉伸。

棋盘图案可用于可视化光照贴图纹理分布。请注意,在我们的模型中,棋盘格相对一致-意味着几乎没有光照贴图失真

棋盘格的拉伸和弯曲表明,光照贴图纹理的分布有些不一致

在此示例中,我们将应用我们所学的有关UV展开的知识,以优化教程项目中对象的预计算时间。

  • 打开示例项目中包含的LightingTutorialStart 场景。
  • 在Hierarchy窗口中选择一个名为HouseBig02 的对象。这些分组在Environment->Structures->Houses下。
  • 打开Lighting窗口(Window->Lighting ),然后选择Object选项卡。
  • 从标签左上方的下拉菜单中选择Charting
  • 展开选项卡底部的Preview区域。请注意,此处显示了UV壳个数以及相应的彩色图表数。

该图显示了具有默认展开设置的HouseBig02对象的制图预览。此图表数量可以轻松减少

HouseBig02 是我们场景中的一个相当复杂的对象,可能证明使用多个图表是合理的。但是,我们仍然可以通过修改展开设置来减少此数量。

对象展开设置面板

对于展开对象,没有一种适合所有解决方案的解决方案。Unity的展开算法尝试根据适当的默认值做出明智的决定,但是在某些用户指导下,我们可能能够获得更理想的结果。

  • 在Hierarchy窗口中选择HouseBig02
  • 打开Lighting窗口(Window->Lighting),然后选择Object选项卡。
  • Max Distance降低到最小值0.1。


预计算过程将开始。经过简短的计算,我们可以在Lighting窗口的Preview区域中看到图表数量显着增加。检查Scene视图似乎没有什么变形,这很好。但是,不幸的是,对于这种复杂的对象来说,这么多的图表是不可接受的。请记住,更多的图表意味着更长的预计算时间和运行时降低的性能。

  • 如果在Hierarchy窗口中未选择HouseBig02 ,请选择它。
  • 导航到“照明”窗口(“ 窗口” >“ 照明” ),然后选择“ 对象” 选项卡。
  • 将“ 最大距离” 的值设置为10。


我们现在面临相反的问题。图表的数量有所减少,但是以给我们的光照贴图带来不可接受的失真为代价。我们可以在“ UV Charts”绘制模式中观察到这种变形。变形表现为棋盘格覆盖图的条纹或拉伸。

选择的“最大距离”过高会导致我们的光照贴图UV变形

我们知道Unity的展开算法会尝试通过将UV壳合并在一起来最大程度地减少图表的数量。“最大距离”设置指定在考虑合并UV壳之间在世界空间中允许的最大距离。如果UV壳之间的距离此值更远,它们将不会合并。

当我们减小“最大距离”时,可以合并的UV壳较少。这意味着在流程结束时还有更多的独立图表。当我们增加“最大距离”时,可以将世界空间中相距甚远的UV壳合并。这样可以减少图表的数量,但是这种积极的合并也会导致扭曲的光照贴图UV,从而导致光照贴图输出中的失真更大。

请注意,对于大型物体,有时可能需要增加“最大距离”以适应网格内面的大小。相反,如果物体较小,则减小“最大距离”可能会产生更好的结果。

以我们的对象HouseBig02为例,“最大距离”值为0.8可以很好地折衷图表数量和变形。

  • 如果在Hierarchy窗口中未选择HouseBig02 ,请选择它。
  • 导航到Lighting窗口(Window->Lighting),然后选择Object选项卡。
  • 将“ 最大距离” 的值设置为0.8。

使用0.8的“自动UV最大距离”可以为我们的示例对象带来良好的效果。但是,我们仍然可以进一步改进它

现在我们来看一下“最大角度”参数。与“最大距离”一样,此值会影响Unity展开算法的UV合并步骤。除测试合并UV壳之前的距离外,展开器还测试相邻网格面之间的角度。仅将角度小于此值的边合并。

较小的“最大角度”意味着较少的边缘将通过测试。结果,将合并更少的UV壳,并且图表数量将增加。相反,较大的“最大角度”意味着合并算法将更能容忍面之间的角度。更多的UV壳可能会合并,其结果可能是更少的UV壳并因此减少图表。与“最大距离”一样,如果由于过宽的容差而合并了不合适的边缘,则最终的光照贴图UV中可能会发生变形。

  • 如果在Hierarchy窗口中未选择HouseBig02 ,请选择它。
  • 导航到“照明”窗口(Window->Lighting),然后选择Object选项卡。
  • 将“ 最大角度” 的值设置为0。


当我们查看Lighting窗口的Preview区域时,我们可以看到创建的图表数量过高。这是因为在考虑合并之前,仅允许面之间的偏差为0度或更小。这几乎可以肯定意味着没有UV外壳会通过测试,因此在合并过程之后将保留许多图表。

没有一些容差,较低的“最大角度”将导致图表数量过多

接下来,我们将尝试增加“最大角度”。

  • 如果在Hierarchy窗口中未选择HouseBig02 ,请选择它。
  • 导航到Lighting窗口(Window->Lighting),然后选择Object选项卡。
  • 缓慢增加“ 最大角度” 的值,观察Lighting窗口的Preview区域中每次更改的效果。

    我们可以看到,图表的数量随着值的增加而减少。这是因为考虑合并的网格面之间允许的角度更宽容。更多的UV壳通过了测试,将被合并。因此,减少了光照贴图UV壳的数量,并减少了相应图表的数量。

增大“最大角度”可以帮助减少图表,尤其是在具有圆形表面的对象上

对于我们的示例对象HouseBig02 ,自动UV最大角度为93会产生良好的效果。

  • 如果在Hierarchy窗口中未选择HouseBig02 ,请选择它。
  • 导航到Lighting窗口(Window->Lighting),然后选择Object选项卡。
  • 将“ 最大角度” 的值设置为93


请注意,在进行简短的预先计算之后,Lighitng窗口的Preview区域中减少了图表的数量。

在对HouseBig02的展开设置进行了一些优化之后,它的Charting预览

在此阶段,可以将我们优化的展开设置恢复到工作场景中。

  • 如果在Hierarchy窗口中未选择HouseBig02 ,请选择它。
  • 在Inspector面板中,找到“ MeshRenderer”组件,然后单击其显示右上方的齿轮图标。
  • 单击复制组件
  • 打开LightingTutorialStart 场景。
  • 在名为HouseBig02 的层次结构中找到所有对象。
  • 按住Ctrl键(在Mac上为Cmd ),然后单击Hierarchy窗口中的每个HouseBig02 GameObjects ,将其全部选中。
  • 导航到Lighting窗口(Window->Lighting),然后选择Object选项卡。
  • 选择右上角的齿轮图标。
  • 选择“ 粘贴组件值” 以应用先前复制的设置。

复制组件是一种将展开的设置返回到主场景的简便方法

当在数百个对象的场景中应用这些设置时,这些设置的适度节省使我们可以进行更重要的优化。

展开设置:按实例(per-instance)还是按预制(per-Prefab)?

可以通过将展开设置,应用于Prefab层次结构中的任何Static MeshRenderer组件,将其存储在Prefab中。或者,也可以将展开设置应用于场景中的各个GameObject。应用于场景中Prefab实例的展开设置将覆盖存储在Prefab中的设置。这种工作方式为我们提供了一些设置场景照明的有用方法。

为预制件配置默认的展开和照明设置通常很有用。如果要多次实例化预制件,则可以省去为该对象进行预配置的工作,而不必在整个场景中重复指定。

另一方面,经常需要基于在整个场景内使用对象的环境来配置照明设置。例如,如果将在可玩区域内近距离看到Prefab实例,则在该实例上使用更高的保真度设置是有意义的。如果Prefab实例距离很远,那么使用我们的照明预算来保持相同的设置就没有意义了。在这里,我们可能希望降低光照贴图的质量,并在展开时使用更具“粗犷(aggressive)”的拼接参数。

配置的默认设置适用于大多数用例,然后在特殊情况下覆盖这些设置的功能非常有用。对于此照明教程,我们将在场景中按实例应用设置。


在整个场景中应用展开设置

现在该开始将我们对Unity的自动展开算法学到的知识应用于LightingTutorialStart 场景中其余的静态几何体。系统地工作可以很快地建立场景,从而大大缩短了预计算时间。

  • 打开示例项目中包含的LightingTutorialStart 场景。
  • 在Hierarchy窗口中,选择Environment->Structures下的顶部GameObject 。
  • 将GameObject复制到一个空的场景。

在这一点上,我们应该运用我们已经了解的展开参数,并随意尝试不同的值。切记将“ UV Charts”绘制模式与Lighting窗口的Preview区域的Charting模式结合使用。这将使我们能够在光照贴图失真和所需图表数量之间找到适当的平衡。

LightingTutorialOptimal 场景可以作为在我们不确定情况下的参考。请注意,在某些情况下,甚至根本不需要更改默认的展开值。默认值实际上可以提供最佳结果。

  • 对展开参数使用不同的值进行实验,直到在“图表数量”和“光照贴图变形”之间达到平衡。
  • 复制设置,返回到LightingTutorialStart 场景,然后将其粘贴到同一GameObject的所有其他实例中。多次选择层次结构中的所有对应对象,将使您能够使用“ 粘贴组件值”在多个对象之间快速应用设置。
  • 对Hierarchy视图中的每个唯一命名的GameObject重复此过程。

一旦优化了Structures组下的所有GameObject,请移至Rocks组下的其余“静态”几何体。以这种方式有条不紊地工作,设置场景中所有“静态”几何体的展开值应不超过几分钟。手动准备的结果将是在场景照明时加快迭代速度,并在运行时提高性能。


了解簇(Clusters)

到目前为止,我们已经根据图表讨论了预计算实时GI。减少或优化场景中图表的数量会限制操作次数,例如在预计算过程中所需的光照贴图合成和打包。这有利于预计算性能,是减少Unity预计算实时GI解决方案所需数据集大小的广泛方法。

修改是一种更细粒度的方法,它将使我们能够减少Unity预计算过程中后续任务中所需的操作数量。减少簇数量的另一个好处是运行时间性能也将得到提高。

当使用预计算实时GI生成场景的照明解决方案时,Unity通过处理静态场景的纹素化“代理”来简化所需的计算。这些纹素称为簇。簇实际上是映射到我们用于照明的静态几何图形的表面补丁(小瓦片)。簇以分层关系存储,并用于预计算Unity的漫反射全局照明解决方案时所需的复杂照明计算。请注意,尽管簇的映射方式与图表相似,但两者实际上是独立的。

簇场景绘制模式可用于可视化Unity的预计算实时GI生成的簇的大小

簇对将其映射到的静态几何体的albedo进行采样。然后,在预计算的Light Transport 阶段,将计算这些簇之间的关系,以便可以在整个簇网络中传播光。Unity会生成静态场景的这种低分辨率近似值,以便简化在运行时需要更新的照明数据量,以便在当前硬件的限制下以交互帧速率提供全局照明。

该图显示了簇X的照明值与附近簇的值之间的关系(图片由Geomerics提供)

一旦完成预计算,就可以修改环境(天空盒)照明以及灯光位置,强度和颜色,而无需重新启动预计算过程。考虑到最终输出中场景的albedo和场景材质的emission,这些照明更改将在整个簇网络中反弹并渗透。

初始反弹之后,更新的照明结果可以应用于簇本身。每次迭代之后,照明的簇将被采样到相应的光照贴图纹理中,然后最终由场景中的着色器使用。

由于此过程是在CPU上异步执行的,因此刷新全局照明解决方案所花费的时间受可用工作线程数量的限制。如果需要,可以使用Lighting窗口中的“ CPU Usage”设置来控制辅助线程的数量。

一旦在整个簇网络中反弹了光线,“Lit Clustering”绘制模式就会显示簇

可以使用Clustering Lit Clustering 场景绘制模式来可视化。使用簇时,场景将由彩色正方形组成的诊断图案覆盖。当映射到相应的静态几何图形时,每个正方形的大小表示簇的大小。每种唯一的颜色代表场景中的不同簇。同样,对于Lit Clustering 绘制模式,一旦灯光已经在整个簇网络被反弹,并将结果写回到簇,就会显示这些簇。

减少簇的数量在很大程度上决定了此更新发生的速度,并因此决定了交互式Unity的预计算实时GI在目标平台上的显示方式。更重要的是,就本教程而言,减少簇数量将缩短预计算照明所需的时间。结果是,照明场景时的迭代速度也将提高。在本教程的以下部分中,我们将介绍减少簇数的技术。


使用光照贴图参数进行微调

通过使用光照贴图参数,可以使用Unity提供的许多高级光照贴图控件。这些设置存储在“光照贴图参数”资产中。这允许在场景之间共享照明设置,并控制版本以在协作团队环境中共享使用。

  • 要创建光照贴图参数资产,请导航到Project窗口。
  • 从Project窗口左上方的Create下拉菜单中,选择(Create->Lighmap Parameters)。
  • 我们还可以从Project窗口中的右键单击菜单,或从顶部菜单栏(Asset->Create->Lightmap Parameters)创建"Lightmap Parameters"资产。

可通过光照贴图参数使用“烘焙GI”和“预计算实时GI”的高级控件

创建后,可以将“光照贴图参数”(Lightmap Parameters)资产分配给“静态MeshRenderer”组件。

  • 在Hierarchy窗口中,选择我们希望将“光照贴图参数”资源分配给的GameObject。GameObject必须标记为“静态”并具有MeshRenderer组件。
[以下部分在新版本中不一致,Lighting->Lightmapping Settings 中可以设定场景默认的灯光贴图参数;对象的Mesh Render下可以选择使用场景默认设置或自定义参数]
  • 打开Lighting窗口(Window->Lighting),然后选择Object选项卡。
  • 使用Advanced Parameters下拉菜单将“光照贴图参数”资产分配给GameObject。“高级参数”下拉菜单右边的“编辑”按钮可以用作修改分配给所选对象的光照贴图参数的快捷方式。

使用“光照”窗口的“对象”选项卡中的“高级参数”下拉菜单分配光照贴图参数

可以将相同的“光照贴图参数”资源分配给多个对象。为此,请在Hierarchy窗口中选择多个对象,然后执行上述步骤。对该光照贴图参数资产的更改将影响分配给它的所有对象。

光照贴图参数:按实例(per-instance)还是按预制(per-Prefabs)?

与展开设置相似,可以将“光照贴图参数”(Lightmap Parameters)资源分配给Prefab或应用于场景中的各个GameObject实例。应用于场景中Prefab实例的Lightmap Parameters资产将覆盖存储在Prefab中的Lightmap Parameters资产。

这种方法的优点是可以将适用于大多数情况的默认光照贴图参数应用于预制件。然后,当需要更多细粒度的控制时,可以在场景中逐个覆盖这些默认值。

在本教程中,我们选择了基于每个实例应用“光照贴图参数”资产。这是因为我们要根据使用每个GameObject的上下文选择不同的“光照贴图参数”资源。

默认参数

可以配置场景范围内的默认光照贴图参数。这些默认的光照贴图参数将分配给场景中尚未分配光照贴图参数资产的所有现有MeshRenderer。随后在Scene中创建的所有MeshRenderer也将使用默认的“光照贴图参数”。使用此方法可以减少设置场景以进行照明时需要执行的手动分配量。

[以下部分在新版本中,可以在Lightmapping Settings下直接设置]

  • 打开Lighting窗口(Window->Lighting),然后选择Scene选项卡。
  • 使用Default Parameters下拉菜单将“光照贴图参数”资源分配给场景。

请注意,尽管此默认参数将应用于所有新创建的对象,但仍可以通过为对象分配高级参数来覆盖单个对象,如上所述。

默认参数将分配给所有新创建的静态网格物体渲染

Unity提供了许多预配置的光照贴图参数,以帮助快速设置场景光照。这些是:

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

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

光照贴图参数说明

Unity的默认参数旨在涵盖许多常见用例,并且对于许多照明场景而言通常就足够了。通过创建我们自己的光照贴图参数资产,可以对预计算的实时GI系统进行更细粒度的控制。
在本教程中,我们将重点介绍对照明优化最有用的设置。

分辨率

通过使用分辨率 值,确定对象所需的光照分辨率。分辨率是用于与Lighting窗口的Scene选项卡中指定的“Scene's Realtime Resolution”[新版本为Indiret Resolution?] 相乘的乘数。例如,如果“场景”的“实时分辨率”设置为2,并且“分辨率”属性设置为0.5,则分配了此“光照贴图参数”的所有对象将在生成的光照贴图纹理中每单位使用1纹素。


由于预计算实时GI仅代表场景中的漫反射和间接照明,因此我们不需要使用传统的烘焙光照贴图方法所需的分辨率。预计算实时GI所需的光照贴图分辨率通常最大为每单位2-3纹素,而我们在传统的光照贴图中可能使用的每像素20-30像素。在大多数情况下,尤其是对于大型户外物体(例如地形),此值可能还要低很多倍。在此,每单位低至0.1纹素的光照贴图分辨率可以提供足够的细节。

通过增加“辐照度预算(Irradiance Budget)”值,可以减轻使用高分辨率光照贴图时的晃动伪影

请记住,当使用非常高的光照贴图分辨率时,在较低分辨率下不明显的伪影可能会成为问题。这些伪影可能会在生成的光照贴图纹理中显示为柔光或污迹。如果发生这种情况,增加光照贴图参数中的辐照度预算通常可以减少此类问题的出现。

簇分辨率

簇分辨率 指定可以容纳在预计算实时GI光照贴图的纹理像素中的簇的数量。例如,如果将“簇分辨率”设置为最大值1,则光照贴图中的每个纹理像素将有1个群集。群集分辨率值为0.5意味着仅0.5个簇将适合光照贴图纹理。换句话说,簇将是光照贴图纹理像素的两倍。

进一步扩展这个想法,想象一下我们场景的全局实时分辨率设置为1。我们创建一个大小为1x1x1单位的多维数据集,然后将“光照贴图参数”资源分配给该对象。如果我们的光照贴图参数资产指定的分辨率为1,簇分辨率为1,则立方体的每侧将有1个簇。然后,如果我们将分辨率提高到2,则结果将是立方体的每侧2x(1x1)个簇,从而得到4个簇。

该图显示了实时分辨率为1的场景中的1x1x1单位立方体。分配的光照贴图参数指定的簇分辨率为1簇/纹素。因此,如果光照贴​​图的分辨率为每单位2纹素,则每个面有4个簇

在大多数情况下,“簇分辨率”仅需为光照贴图像素的大小的一小部分。例如,Unity 随附的默认-高分辨率光照贴图参数资产的簇分辨率为0.6。

场景中的大量簇可以快速增加预计算时间,并减少运行时场景全局照明的交互性。因此,我们必须确保使用更多的簇为光照贴图输出的质量提供一些明显的好处。如果我们可以使用更少的簇而不会对我们的光照贴图产生不利影响,那么这始终是首选。

将光照图的分辨率和“簇分辨率”指定为比率意味着我们可以与“场景范围的实时分辨率”值建立相对关系。我们可以将Lighitng窗口中定义的“实时分辨率”用作整个场景的高级分辨率值。然后,使用光照贴图参数对单个对象或对象组进行精细控制。

Unity采取这种分层方法,以便为用户提供更多的全局控制。如果有必要为“分辨率”和“簇分辨率”指定一个绝对值,则我们要修改整体照明分辨率时,必须手动重新配置项目中的每个“光照贴图”参数。

辐照度预算(irradiance Budget)

我们在本教程的前面部分讨论了Unity如何通过使用簇生成场景静态几何的近似值来计算预计算实时GI。在预计算期间,将计算这些簇之间的关系,以便可以在整个层次网络中快速传播光。

本质上,光照贴图纹素的值是通过从纹素位置获取场景簇的“视图”来确定的。这使我们能够快速计算簇之间的光反射,以创建全局照明的效果。然后可以在最终渲染之前将这些簇采样到光照贴图中。

辐照度预算 决定对簇网络进行采样时,每个光照贴图纹素使用的内存量。这决定了照明结果的精度(准确性)。较低的辐照度预算意味着在记录此场景视图时每个纹素使用较少的内存。这样既减少了内存使用,又降低了运行时的CPU成本,但以照明保真度降低为代价。较低的辐照度预算将导致较低的频率(模糊)照明结果。相反,较高的“辐照度预算”将提供更准确的GI,但会增加内存使用率并在运行时增加CPU开销。

如果我们的预计算实时GI在运行期间更新得不够快(滞后),则降低辐照度预算可能会有所帮助。最好在高保真度照明的优点可能不太明显的物体上使用,例如较大,模糊或较远的几何形状。

辐照质量

在预计算过程中生成预计算实时GI光照图时,每个光照贴图纹素都会向场景中发射光线,以报告附近簇的可见性。然后计算纹素可以看到的每个簇的百分比。在确定可见簇对光照贴图中每个纹素的光照贡献时使用此值。辐照度质量 指定纹素在此过程中能够发出的光线数量。

在物体与周围光线条件不完全匹配的情况下,应考虑提高辐照质量。有时可能会出现光照贴图纹理产生意外的明亮结果的情况。这可能是因为没有足够的光线投射到场景中,因此错过了可能会遮挡光照贴图纹理的簇。同样,可能未检测到较亮的簇。此处,光照贴图结果将意外地变暗。

发射更多的射线增加了报告周围簇的准确表示的可能性。光照贴图输出精度的这些提高是以增加预计算时间为代价的。为了优化预计算时间,我们应该使用达到所需照明效果所需的最低辐照质量。请注意,此值不会影响运行时性能。

背面公差(Backforce Tolerance)

当从场景簇中


鲜花

握手

雷人

路过

鸡蛋

暂无相关评论

评论文明上网理性发言,全站可见,请文明发言