原文:https://unity3d.com/cn/learn/tutorials/topics/graphics/probe-lighting?playlist=17102
了解到我们场景中的Charts数量对预计算时间有影响,我们可以通过选择从预计算中完全排除某些对象来大大提高光照性能。这将减少生成的Charts数量。相反,我们可以在这些对象上使用probe lighting,这是从Scene接收间接光照的有效方法。虽然探测器(probe)点亮的物体不会为场景提供反射光,但这通常没有明显的影响。最适合探头照明(probe lighting)的物体往往是较小的物体,无论如何对反射的照明几乎没有影响。
二、What is probe lighting?
Probe lighting是一种快速技术,用于近似实时渲染应用程序(如游戏)中的照明。它通常用于在游戏世界中照明角色和其他非静态(动态)对象。探头照明在运行时非常高效,并且具有可以快速预计算的额外好处。
探测照明的工作原理是对3D空间中特定点的入射光进行采样,并使用称为球谐函数(spherical harmonics)的数学函数在球体上对此信息进行编码。这些系数具有较低的存储成本,然后可以在游戏中快速“解包”并由场景中的着色器用于近似表面照明。在Unity中,此功能由Light Probes提供。
使用探头照明有一些限制。一个这样的限制是难以在不增加这些特殊数字的顺序(大小)的情况下在球形范围内表示高频或斑驳的照明。不幸的是,随着精度的提高,成本迅速上升,这意味着出于性能原因,我们仅限于低阶球谐函数。
事实上,我们在世界上只有一个3D位置的球形表示,这使得探头照明不适合在非常大的物体上表示照明,在这些物体上可以预期有很多照明变化。另一个限制是 - 当球面谐波编码球体上的值时 - 它们通常不适用于大型平面物体或具有显着凹面的物体。请注意,如果您正在考虑将探头照明与大型物体一起使用,Unity Manual会提供有关光探测器代理卷(Light Probe Proxy
Volumes)(LPPV)的一些信息。
尽管有这些限制,当与合适的较小的凸起物体一起使用时,探头照明将以相对低的成本产生适当令人信服的结果。在本教程的后面,我们将更深入地探讨光探测器的设置和放置,但是现在,我们只需要了解我们可以减少场景中光照贴图Charts的数量,通过选择在适当的地方使用探测光源(probe lighting)。
三、Choosing objects to light with probes
虽然将环境组下的GameObjects设置为静态以使我们的照明设置正在进行中是非常有用的,但是在此父级下面有许多对象可以替代探测照明。清除这些对象的静态标志意味着Unity的预计算实时GI系统不再考虑它们,因此将减少光照图表的数量。请记住,减少场景中的Charts数量是改善预计算时间的关键。
查看Unity Editor的Hierarchy面板,让我们检查Environment GameObject 的子节点。如果我们专门看一下我们在Props下找到的物体,我们会发现其中很多都是小型的碎片式物体和场景装饰,如石头,水桶和木板。这些对象很多,并且这些相对较小的对象中的许多对于打开来说将是复杂的。获得没有失真(are free of distortion)的光照贴图UV很可能会导致大量的UV shells。更多的UV shells需要额外的Charts,更多的Charts意味着要计算更多的光照贴图像素,等等。
鉴于这些对象非常小,它们不太可能对场景中的间接照明做出太大贡献。同样,它们的尺寸意味着几乎没有表面区域可以显示详细的光照变化(为什么适合,两点原因)。这使得这些对象非常适合探测照明(probe lighting)。我们的预计算时间不仅会被降低,而且由于我们需要存储在内存中并在着色器中解码的光照贴图数量减少,因此运行时的性能也会提高(两个原因,两个作用)。
1)在Hierarchy视图中选择Props GameObject。
2)在Inspector面板中,取消选中Static复选框。
3)选择Yes,在提示时change children。
此时,如果我们将预计算保留足够长的时间,我们最终会在Scene视图中看到我们的光照结果。我们可能会注意到,我们的探测照明的非静态对象与它们周围的对象的点亮方式不同,并且与场景的光照不匹配。这是因为我们尚未设置Light Probes,因此这些对象会回落到Scene的Ambient Probe。环境探测器(Ambient Probe)本质上是场景中的隐藏探测器,对用户不可见,它仅对Lighting窗口中被设置的“环境光源”(Ambient Source)进行采样。
为了将我们的非静态物体更加令人信服地放入其周围环境中,我们需要花一些时间将光探测器放置在场景周围,以便在全世界范围内采样间接照明。
四、Placing Light Probes
非静态对象基于邻近探测器(probes)的接近度接收照明。关于物体可以“读取”哪个探测器的决定是通过将光探测器之间的空间划分为四面体体积然后检查给定物体落入哪个四面体来做出的。因此,为了制造这些四面体,必须将探针定位成使得它们形成3D体积(volume)或笼(cage)。
探头照明(Probe lighting)在运行时不太耗性能,并且可以快速预先计算。但是,为了最大限度地提高性能,在放置探针时需要注意一些事项。虽然设置更快,但光探测器的密集网格布置可能是浪费的,因为这些探测器不会在局部照明条件下采样很多变化。为了提高效率,更好的做法是在探测器发生明显变化的区域周围以更大的密度定位探头。这可能包括例如从光到阴影的过渡区域,或者可能存在由光反射产生的强烈颜色的区域。
1)要设置灯光探头(Probes),通过创建一个开始光探针组(Light Probe Group)从游戏物体菜单(GameObject > Light > Light Probe Group)。
2)现在我们将开始放置探针。在Hierarchy视图中选择新创建的光探针组。
3)在检查器(Inspector)面板中,从光探针组(Light Probe Group)组件中选择Edit Light Probes。
4)您可以在Scene视图中选择探针本身。从创建的默认多维数据集排列中删除除一个角点探测之外的所有探测。
5)将剩余探针放置在环境中的Terrain上方,然后按Ctrl + D(Mac上的Cmd + D)复制它。
6)使用平移工具(W),将第二个探头沿Y轴向上移动到第一个探头上方约2米处。
7)现在再次复制探头并将新副本移动得更高,可能在Y轴上再向上移动5米。
创建这样的垂直布置的原因是我们可以对从地面反弹的间接照明进行采样,从头部高度周围以及在空中(对象可能离开地面是可行的)。当我们在场景周围复制这些光探测器以创建我们的体积时,我们希望确保可播放区域中任何位置的对象都落在探针之间创建的四面体之一内。这些体积可视化为探针之间绘制的品红线。
通过按住Shift并单独单击每个探针或拖动选择,选择刚刚创建的所有3个探针。
复制我们创建的整个垂直链,并将其移动到场景中附近的照明区域。
在决定照明感兴趣区域时,寻找阴影区域,或者可能是地形材料颜色发生强烈变化的区域。请记住,我们的目标是在整个场景中对间接或反弹光照进行采样。为了证明添加新探头的成本是合理的,我们必须确保它对照明中的一些明显变化进行采样。如果我们使用我们的Light Probes对具有一般或一致照明的区域进行采样,那么当接收对象通过这些探测器时,我们不太可能看到太多变化。与游戏优化的许多方面一样,我们必须确保我们在场景中包含的每个项目都能带来一些好处。
继续重复此过程,在照明变化区域周围以更大的密度定位探头,直到您创建了一个封装可播放区域的稀疏笼式布局。
在定位我们的探头时,请记住检查最底部的光探头是否刚刚离开地面。
在我们的示例LightingTutorialOptimal Scene中,我们创建了两组Light
Probes:一组用于人口较密集的村庄区域,名为VillageLightProbeGroup,另一组用于村外的稀疏不可玩区域,名为ExtentsLightProbeGroup。第二组涵盖了游戏世界的范围,以防任何非静态MeshRenderers离开可玩区域。我们在场景的这些无法到达的部分中不需要相同程度的保真度,因此该组可以密度低得多。垂直轴上的两个探针就足够了。
将光探测器组拆分为两个游戏对象可以更容易地定位探测器。可以启用或禁用单个光探测器组,以便在场景中工作时提供更清晰的视图。这些组将在运行时自动组合,并带有重复数据删除传递以删除任何重叠的探测器。
要查看我们的Light Probes根据其环境点亮,我们必须等待照明预计算完成。如果在“照明”窗口中启用了“自动”模式,则会自动执行此操作。如果未启用自动模式,我们必须通过导航到Lighting窗口(Window > Lighting)并按Build按钮来手动开始预计算。
完成此过程后,您会注意到场景中的非静态游戏对象现在从光探测器中读取并且看起来更好地匹配场景照明。要在光照状态下查看Light Probes,请在Hierarchy视图中取消选择Light Probe Group。
现在我们已经在场景中设置了Light Probes,我们可以在较小的“prop”对象上获得间接照明的视觉效果,而无需在预计算中包含这些对象而创建额外的图表。