Unity预计算全局实时GI(二)- 实时分辨率
当使用预计算实时全局光照(PRGI)为一个场景设置光照时,首先要决定的是设置场景默认的实时分辨率(Realtime Resolution)。Realtime Resolution是每个世界单位所使用的实时光照贴图纹素(贴图像素)的数量。
Realtime Resolution设定可以在Lighting窗口中找到并调整,方法如下:
* 打开 Lighting 窗口 (Window>Lighting) 然后选择 Scene 标签页。
* 通过勾选 Precomputed Realtime GI 选项 以确保 开启Precomputed Realtime GI 功能。
* 在Precomputed Realtime GI选项框下面,可以看到 Realtime Resolution 属性。
Unity的Lighting窗口显示了场景的全局Realtime Resolution的设置选择一个合适的Realtime Resolution
当设置一个场景时了解你工程的单位比例是很重要的。可能在你的项目里一个单位等于现实世界的1米、一英尺或一公分。Unity中的单位没有默认设成真实世界的比例单位,所以要由开发者自行决定。
在我们的工程中我们已经决定让一个单位等于一米。一些物理概念假设一样,例如在Unity中重力的预设就是以每秒多少单位来表示的。假设一个单位等于一米,对于一个真实世界的场景来说是一个很好的设置。
Realtime Resolution的值通常可以由游戏世界的规模来制定。例如,如果你的场景是一个小型但拥有丰富光照变化的室内环境,为了捕捉这种更详细或者“高频率的”光照,更高分辨率的光照贴图比如每个单位2-3个纹素可能比较合适。
如果你的场景是一个规模较大的户外环境,可能覆盖了几百甚至上千单位(平方米)的表面,而这些表面并不会剧烈地改变反射光的颜色。在这样的情况下,使用这种适合捕捉在室内场景中错综复杂的光照细节的分辨率是一种浪费。我们会浪费宝贵的CPU时间和内存去更新那些对整体外观贡献不大的光照贴图。为了本教程的目的,我们会提高在光照预计算期间必须被考虑的光照贴图的纹素数量。这会对预计算时间产生很大的影响。
针对室外环境,对于场景中的比较大的对象物体,一种合理的光照贴图分辨率设置可能在每单位0.5-1个纹素之间,或者对于terrain来说,那么每个单位0.1-0.5个纹素比较合适。
预计算全局实时光照分辨率 vs 传统的光照贴图
Unity PRGI所需要的Realtime Resolution值比传统光照贴图密度要小好几个等级,这是因为我们只从这些光照图里获取间接光照的数据,且这些数据通常分辨率都很低。所以使用PRGI时,清晰的阴影通常都是通过提供实时阴影而不是高分辨率的光照贴图。
在传统光照贴图技术中,使用每个单位30个纹素这样的设置,可能会导致预计算失败或无法完成计算。
对于室内场景更合适的设置是每个单位2-3个纹素,而对于室外环境则为每个单位0.5-1个纹素。
这种假设是以在真实世界场景中1单位 = 1米的情况为前提,如果世界单位的大小发生改变,这些设置的值响应地就需要被调整
具体可以参考以下的场景与Realtime Resolution值对照表(1单位代表1米):
一个单位代表1米当初次设置我们场景的实时分辨率,我们为我们场景中的静态对象物体指定了默认的分辨率。新建的带有Mesh Renderer且标记为静态光照(Lightmap Static)的对象,会使用这个值一直到它被修改。
除了为整个场景选择实时分辨率,我们还能针对每个对象调整光照贴图的分辨率。在需要高分辨率来提供更高真实感的情况下,我们可以选择性的提高这个值。通常是将场景里最多的对象分辨率设为默认值,然后手动调高需要更多照明细节对象的值。之后我们会讨论修改每个对象物体分辨率的方法。
设置我们场景的 Realtime Resolution
如果你想跟着我们一直学习下去,我们将会在LightingTutorialStart场景中展开教学,这个场景位于本页页顶的链接Lighting Optimisation Tutorial中。
在我们的示例场景中,我们有一个户外场景,这个场景具有一个拥有颜色一致的中等大小的地形。为此,一个每个单位0.5纹素的低实时分辨率对于捕捉场景中从其他对象反射的光照是足够了的。然而,在场景中有一些细节很高的木质房子,它们的数量比地形对象还多,我们应该为房子设置合适的实时分辨率。然后我们可以单独修改地形对象的分辨率,这样可以降低场景准备的工作量。考虑到这一点,我们将要对默认实时分辨率使用每个世界单位1个纹素的设置。操作步骤如下:
* 打开 Lighting 窗口 (Window>Lighting) 然后选择Scene 标签页.
* 设置 Realtime Resolution 的值为1.
由于我们的世界单位设定为1单位 = 1米,这表示一张由Unity中PRGI生成的光照贴图将会是1x1米的大小,这可能看起来像素很低,请记住我们只捕捉间接光照。清晰地阴影以及镜面高光将会在场景中由实时光所计算提供 。