何三思Unity3D技术文档翻译Unity3D

【Unity3D技术文档翻译】第3.6.6.2篇 放置光照探针

2018-08-18  本文已影响24人  何三思
Unity3D技术文档翻译

上一章:【Unity3D技术文档翻译】第3.6.6.1篇 光照探针:技术说明

本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Global Illumination】→【Light Probes】→【Placing Light Probes】

放置光照探针

为了在你的场景中放置光照探针,你必须为一个游戏对象添加 Light Probe Group 组件。你可以通过 Component -> Rendering -> Light Probe Group 菜单来添加该组件。

Light Probe Group 组件可被添加到场景中的任何对象上,然而最好是添加到一个新的空对象上。

Light Probe Group 组件

Light Probe Group 具有自己的 Edit Mode,可以被开启或关闭。想要添加、移动或者删除光照探针,你必须通过点击 Edit Light Probes 按钮来开启编辑模式。

Edit Light Probes 按钮

当你开启了光照探针编辑模式,你就可以像操作游戏对象一样操作每个光照探针,当然,光照探针不是游戏对象——它们被存储为一系列点在 Light Probe Group 组件中。

当你开始编辑一个新的 Light Probe Group 时,默认展现的是一个以立方体结构排列的八个探针,如下图所示:

默认的光照探针排列

你现在可以使用 Light Probe Group 检查器中的控制项,来为组(group)添加新的探针位置。探针是作为黄色球体出现在场景中,可以像游戏对象一样被调整位置。你还可以通过键盘快捷键(ctrl+d/cmd+d)来选中并复制单个的探针或者组。

记住,一旦你已经完成了对探针的编辑,记得将 Light Probe Group 编辑模式切换为 off,否则你会发现你不能移动或者操作其他常规的游戏对象。

选择光照探针的位置

和光照贴图具有一个贯穿物体表面的持续相同的分辨率不同,光照探针信息的分辨率完全由你摆放光照探针位置的疏密决定。

为了优化存储在光照探针中的数据量,以及游戏运行时的计算量,你通常应该尽可能少地放置光照探针。然而,你又应该放置足够多的光照探针,以能够恰当地展现光照从一个区域到另一个区域的过渡。这就意味着,在具有复杂和高度差异光照的区域,你可能需要以更稠密的方式来放置光照探针;而在光照变化不明显的区域,你可能需要以更稀疏的方式来放置光照探针。

一个简单的场景中,光照探针以不同的密度放置

在上图的例子中,建筑之间具有更大差异且色彩变化更多,因此探针被放置得更加密集;而在公路上光照没有明显的变化,因此探针被放置得没那么密集。

最简单的放置探针的方法是按照常规的 3D 网格模式。这样做很简单也很有效,但是可能导致不必要的内存占用,并且可能产生许多冗余的探针。举个例子,在上图场景中,如果在道路上放置许多探针,那将是一种资源浪费。因为光照在道路上没有较大的变化,放置过多的探针会使它们存储的数据和相邻探针的完全相同。在这种情况下,以较低频率间隔放置探针将更加有效率。

光照探针并没有存储大量信息。从技术角度来看,每个探针都是一张来自采样点视图的球面全景 HDR 图,使用一种包含了27个浮点值的 Spherical Harmonics L2(L2 球谐函数)进行编码。然而在包含了数百个探针的大型场景中,如果以不必要的高密度放置探针,将会导致游戏中的大量内存被浪费。

创建一个体积(Creating a volume)

即使你的游戏发生在一个2D平面上(例如,汽车在道路表面行驶),你的光照探针也必须形成 3D 体积。

这意味着,你应该至少包含两个垂直层的点在你的探针组中。

在下图例子中,你能看到在左图中探针只是遍布了地面。这将不会产生理想的光照,因为光照探针系统无法从这些探针中计算可感知的四面体体积。

在右图中,探针被分布在两个层面上,一些低的靠近地面,其他的一些则更高,因此由许多单独的四面体一起组成了一个 3D 体积。这就是一个理想的分布。

左图展示了一个错误的光照探针摆放方式,它们因为没有高度而没有构成体积。右图则展现了一个正确的摆放方式。

动态 GI 中的光照探针放置

你在选择放置光照探针的位置时,必须要考虑到光照将在探针之间做差值处理。如果你的探针没有充分地覆盖场景中的变化,就可能出现问题。

下图例子中展示了一个在两侧各有一个街灯的夜晚场景,并且中间区域是黑暗的。如果光照指针只被放置在街灯附近,而黑暗区域中没有放置一个探针,那么对于移动的对象,来自街灯的光照将渗透穿过黑暗区域。这是因为光照从一个亮点到另一个亮点做了差值处理,而没有包含中间黑暗区域的信息。

该图展示了过少的光照探针摆放。两盏街灯之间的黑暗区域没有放置探针,因此黑暗区域不会被包含在差值处理中。

如果你正在使用实时或者混合光照,该问题可能不那么明显,因为只有间接光照将渗透穿过间隙。而如果你使用的是烘焙光照,该问题就更加明显,因为在这种情况下,移动物体上的直接光照也是从光照探针的差值处理中获得的。在示例场景中,两盏灯都被烘焙了,因此移动对象将从光照探针中获取直接光照。从下图中你能看到最终效果:一个移动对象(救护车)在穿过黑暗区域时仍然保持被照亮,而这不是我们想要的效果。黄色线框四面体展示了差值在一个亮点到街道另一边的亮点之间产生。

这是一个我们不想要的效果:救护车在穿过黑暗区域时仍然保持被照亮。这是因为黑暗区域中没有放置光照探针。

为了解决该问题,你应该在黑暗区域放置更多探针,如下图所示:

现在场景中的黑暗区域也有探针了。结果是:移动的救护车在穿过黑暗区域时具有更暗的光照。

现在,救护车在场景中间时具有更暗的光照,这是我们想要的效果。

如果本文对你有帮助的话,点个赞或者评论一下吧!

下一章:【Unity3D技术文档翻译】第3.6.6.3篇 使用脚本放置光照探针

上一篇下一篇

猜你喜欢

热点阅读