Version: 2018.4
光照探针:技术信息
使用脚本放置探针

Light Probe Group

要将光照探针置于场景中,必须使用已附加 Light Probe Group 组件的游戏对象。可从菜单 Component > Rendering > Light Probe Group 添加 Light Probe Group 组件。

可将 Light Probe Group 组件添加到场景中的任何游戏对象。但是,最好创建一个新的空游戏对象(菜单:__GameObject > Create Empty__),然后将该组件添加到这个游戏对象,从而降低意外将该组件从项目中移除的可能性。

Light Probe Group 组件
Light Probe Group 组件
属性 功能
Edit Light Probes 要更改 Light Probe Group,请单击 Edit Light Probes 按钮以启用编辑。这会更改 Unity,只允许移动和编辑光照探针,因此必须记住在完成后禁用此设置。启用 Edit Light Probes 后,无法在 Unity 中移动和编辑游戏对象或其他元素。
Show Wireframe 启用此属性后,Unity 将在 Scene 视图中显示 Light Probe Group 的线框。禁用后,Unity 仅显示光照探针点,而不显示连接这些点的线框。
Remove Ringing 启用此属性后,Unity 会自动从场景中消除光照探针振铃。有关更多信息,请参阅本节稍后部分的振铃
Selected Probe Position 此属性提供场景中所选光照探针的 x、y 和 z 坐标。此属性为只读。
Add Probe 单击此按钮向 Light Probe Group 中添加光照探针。
Select All 单击此按钮选择 Light Probe Group 中的所有光照探针。
Delete Selected 单击此按钮从 Light Probe Group 中删除所选的光照探针。
Duplicate Selected 单击此按钮复制所选的光照探针。

振铃

在某些情况下,光照探针会出现一种称为“振铃”的不良行为。当光照探针周围的光线存在显著差异时,通常会发生这种情况。例如,如果光照探针的一侧有明亮的光线,而另一侧没有光线,则光强会在背面“过冲”。这种过冲会在背面产生光斑。

光照探针振铃示例
光照探针振铃示例

有几种方法可以解决此问题:

在 Light Probe Group 组件中,启用 Remove Ringing。Unity 会自动移除意外的光斑。但是,这种方法通常会使光照探针不太准确,并会降低光线对比度,因此您必须检查视觉效果。 可通过这样的方式放置游戏中的障碍物,使玩家无法到达他们可以看到光斑的位置。 避免将直射光烘焙到光照探针中。直射光往往具有明显的不连续性(例如阴影边缘),因此不适合光照探针。要仅烘焙间接光,请使用混合光照。 若要为动态游戏对象提供光照,请使用实时 GI 而非光照探针。

放置光照探针

编辑 Light Probe Group 时,可按照与游戏对象类似的方式来操作单个光照探针。但是,光照探针不是游戏对象,而是 Light Probe Group 组件中的一组点。

开始编辑新的 Light Probe Group 时,从一个立方体中排列的八个探针的默认编队开始,如下所示:

光照探针的默认排列。
光照探针的默认排列。

现在可以使用 Light Probe Group Inspector 中的控件向该组添加新的探针位置。探针在场景中显示为黄色球体,这些球体可按照与游戏对象相同的方式定位。还可以使用常规的“复制”键盘快捷键 (ctrl+d/cmd+d) 来选择和复制单个探针或按组进行这些操作。

完成光照探针的编辑后,务必禁用 Light Probe Group 编辑模式,这样就可以继续正常编辑和移动场景中的游戏对象。

选择光照探针位置

与通常在对象表面具有连续分辨率的光照贴图不同,光照探针信息的分辨率取决于放置光照探针的紧密程度。

为了优化光照探针存储的数据量以及游戏在进行时完成的计算量,通常应尝试尽可能少量放置光照探针。但是,在可以接受的范围内,建议放置足够多的光照探针来记录一个空间到另一空间的光线变化。这意味着,在具有复杂或高对比度光线的区域周围可提高光照探针的放置密度,而在光线没有显著变化的区域可降低它们的放置密度。

在简单场景周围放置不同密度的光照探针
在简单场景周围放置不同密度的光照探针

在以上示例中,建筑物附近和之间的对比度和颜色变化较大,因此光照探针放置得较密集,而沿着道路的光照没有显著变化,因此放置密度较小。

定位光照探针的最简单方法是将它们排列成常规 3D 网格图案。虽然此设置简单有效,但可能会消耗不必要的内存,并可能有大量冗余的光照探针。例如,在以上场景中,如果沿着道路放置大量光照探针,将会浪费资源。光照沿着道路的长度不会发生太大变化,因此许多光照探针将大多数相同的光照数据存储到相邻光照探针中。在此类情况下,通过在稀疏光照探针之间插入此光照数据,效率会高得多。

光照探针不会单独存储大量信息。从技术角度来看,每个探针都是来自采样点的球形全景 HDR 图像,使用存储为 27 个浮点值的球谐函数 L2 进行编码。然而,在具有数百个光照探针的大型场景中,这些探针可以累加,而设置密集度过高的光照探针可能导致游戏中大量内存浪费。

创建体积

即使游戏位于 2D 平面上(例如,在路面上行驶的汽车),光照探针也必须形成 3D 体积。

这意味着光照探针组中至少应有两个垂直“层”的点。

在以下示例中,在左侧看到光照探针仅排列在地面上。因为光照探针系统无法从光照探针计算明显的四面体体积,所以这种排列方式不会产生良好光照。

在右侧,光照探针排列为两层,一些低至地面,另一些高于地面,因此它们一起形成由大量单个四面体组成的一个 3D 体积。这是一种良好的布局。

左图显示了光照探针位置的选择不当,因为光照探针定义的体积没有高度。右图显示了光照探针位置的选择较恰当。
左图显示了光照探针位置的选择不当,因为光照探针定义的体积没有高度。右图显示了光照探针位置的选择较恰当。

放置光照探针以实现动态 GI

Unity 的实时 GI 允许移动光源针对静态景物投射动态反射光。但是,使用光照探针时,还可从移动游戏对象上的移动光源接收动态反射光。

因此,光照探针执行两个非常相似但不同的功能:它们存储静态烘焙光源,并在运行时代表动态实时全局光照(GI 或反射光)的采样点来影响移动对象上的光照。

所以,如果要使用动态移动光源,并希望移动游戏对象上有实时反射光,这可能会影响放置光照探针的位置以及将它们分组的密集程度。

在这种情况下要考虑的要点是,对于大面积范围内相对不变的静态光源,因为光照不会在大面积范围内变化,只需放置少数几个光照探针。但是,如果计划在此区域内使用移动光源,并且希望移动对象用来接收反射光,则需要在该区域内建立更密集的光照探针网络,以便有足够高的准确度来匹配光源的范围和样式。

放置光照探针需要的密集程度因光源的大小和范围、其移动速度以及希望接收反射光的移动对象的大小而异。

光照探针放置故障排除

对光照探针位置的选择必须考虑到光照将在光照探针组之间进行插值的情况。如果光照探针不能充分适应场景中光照的变化,可能会出现问题。

以下示例显示了一个夜间场景,两侧有两个明亮街灯,中间有一个暗区。如果光照探针仅放置在街灯附近,而在暗区中没有放置,则街灯的光照会跨越黑暗间隙“渗透”到移动对象上。这是因为光照会从一个亮点插入到另一亮点,而没有关于暗区的信息。

此图像显示了不佳的光照探针放置。两个街灯之间的暗区内没有光照探针,因此暗区根本不会包含在插值中。
此图像显示了不佳的光照探针放置。两个街灯之间的暗区内没有光照探针,因此暗区根本不会包含在插值中。

如果使用实时或混合光源,此问题可能不太明显,因为只有_间接_光才会跨越间隙渗透。如果使用完全烘焙光源,问题会更明显,因为此情况下也会从光照探针插入移动对象上的直射光。在此示例场景中会烘焙两个街灯,因此移动对象从光照探针获得直射光。在下图中,可看到结果:一个移动对象(救护车)在穿过暗区时仍然获得明亮光照,这不是想要的效果。黄色线框四面体显示出,插值发生在街道明亮光照的一端与另一端之间。

这是不想要的效果:救护车在穿过暗区时仍然获得明亮光照,因为在暗区中没有放置光照探针。

要解决此问题,应该在暗区中放置更多光照探针,如下所示:

现在场景的暗区中也有了光照探针。因此,移动的救护车从场景的一侧移动到另一侧时,救护车上的光照更暗。

现在,救护车在场景中心时,车上的光照更暗,这符合要求。
现在,救护车在场景中心时,车上的光照更暗,这符合要求。

  • 2018–10–17 页面已修订并只进行了有限的编辑审查

  • 2017–06–08 页面已发布但未经编辑审查

  • 2018.3 版中添加了 Remove Ringing NewIn20183

  • 在 5.6 版更新了光照探针

光照探针:技术信息
使用脚本放置探针