技术专区 \ Unity3D

Unity预计算实时GI (二)实时分辨率

Unity3D 预计算实实Gi Gi ⋅ 2017-05-16 13:10:07

我们已经在《Unity预计算实时GI (一)介绍》中聊到Unity预计算实时GI的必要性和学习准备,并且了解到实现这个过程需要考虑的问题。本文我们对如何定义一个适合场景的光照分辨率进行了相关介绍,一起来学习一下吧!

如何调整实时分辨率?

当使用PRGI来计算场景照明时,首先要做出的判断之一是确定场景的实时分辨率(Realtime Resolution),因为它决定每个世界单位所使用即时光照的贴图像素数量。Realtime Resolution设定可以在Lighting窗口中找到并调整,方法如下:

Unity的Lighting窗口:主要显示整个场景会用到的光照设定。

  • 通过Window > Lighting菜单,开启Lighting窗口,并选择Scene标签页。

  • 确保Precomputed Realtime GI选项打上勾,在它下面找到Realtime Resolution属性,即可设置它的值。

 

但这个分辨率应该如何设置呢?

 

选择适当的分辨率

在设定场景时,首先要了解你的项目使用的单位比例,可能在你的项目里一个单位等于现实世界的1米、一英尺或一公分。Unity没有默认真实世界的单位,所以要由开发者自行决定。

在这个范例里我们采用1 unit(单位) = 1 meter(米)。因为这和Unity的物理概念不谋而合。举例来说Unity的重力预设就是以每秒多少单位来计算的,因此设定1单位 = 1米对于一个真实世界的场景来说是恰当的。

Realtime Resolution的值通常可以由游戏世界的规模来制定。例如,你的场景是一个拥有丰富光照变化的室内环境。在这种情况下,高一点的值比如2 - 3,可以捕捉到更详细或"高频"的光照。

如果你的场景是一个规模较大的户外环境,可能覆盖了几百甚至上千单位(平方米)的表面,而这些表面并不会剧烈地改变反射光的颜色。在这样的情况下,把适合计算复杂室内场景的设定用在有大量相同特征的室外环境是很浪费的。我们会浪费宝贵的CPU时间和内存去更新那些对整体外观贡献不大的光照贴图。为了教学目的,我们会提高PRGI计算期间必须考虑的光照贴图的像素数量,这会对预计算的时间造成很大的影响。针对室外环境,可以为场景中尺寸较大的游戏对象设置0.5 - 1的texel,针对地形可以设置0.1- 0.5的texel。

Unity PRGI所需要的Realtime Resolution值比传统光照贴图密度要小好几个等级,这是因为我们只从这些光照图里获取间接光数据,且这些数据通常分辨率都很低。所以使用PRGI时,清晰的阴影通常都是通过实时运算而非高分辨率的光照图来提供的。

在这里使用传统光照惯用的值,例如:30 texels,可能会导致预计算失败或无法计算。室内场景比较适合的值是2 - 3,室外场景则是0.5 - 1。这是我们在使用1单位 = 1米的前提下,如果单位大小不同这些值就需要调整。

具体可以参考以下的场景与Realtime Resolution值对照表(1单位代表1米):

  • 室内:2-3 像素/单位

  • 户外:0.5-1 像素/单位

  • 地形:0.1-0.5 像素/单位

当设定场景实时分辨率时,Unity会指定给场景内的静态对象。新建的带有Mesh Renderer且标记为静态光照(Lightmap Static)的对象,会使用这个值一直到它被其他设置修改。除了帮场景加上分辨率设定外,我们还能针对每个对象调整光照贴图的分辨率,在需要高分辨率来提供更高真实感的情况下,我们可以选择性的提高这个值。通常是将场景里最多的对象分辨率设为默认值,然后手动调高需要更多照明细节对象的值。

总结

本文我们了解到使用PRGI来计算场景照明时,如何确定场景的实时分辨率,这是开始与计算的重要步骤,相信你已经掌握了!后续我们会对光照图进行阐释,并且一起真正地开始实时预计算,敬请期待!