技术专区 \ Unity3D

Unity预计算实时GI (三)了解光照图

Unity3D 预计算实实Gi Gi ⋅ 2017-05-16 13:22:14
我们曾经为大家介绍了预计算实时GI的必要性,以及在实现预计算实时GI时,如何定义一个适合场景的光照分辨率。本文我们一起来看看光照图,了解一下它是如何影响计算时间的。

光照图是什么?

在Unity PRGI里,一个光照图(Chart)是表示一个光照贴图(Lightmap)的区域,用来映射场景对象的光照贴图UV。你可以认为它是能影响对象的一张瓦片图。一张光照图由两部分组成:辐照度(光照)和方向性(主要光线方向编码)。

当产生PRGI数据时,图表里的每个texel都会被计算光照。换句话说,场景里面有大量的光照图可能会增加PRGI耗时的主要原因之一,因此理解光照图的运作原理以及如何管理它们来优化光照计算的时间是很重要的。

光照图的尺寸

最小的4x4 texel的UV光照图

如上图所示,这是最小的4x4单位的UV光照图,为了防止贴图过滤造成的渗色,UV贴图始终被光照图包住并空出一半texel的宽度。

在预设的情况下,每张光照图最少要有4x4 texel的大小,所以说不管世界中的物体或对应的UV有多大,一张图表至少需要16个texel。因此如果有一个1x1米的对象并带有一个图表,间接分辨率是1,那这个对象就会需要16个texel来表现。最后Unity会将这些图表缝合在一起,作为模型边缘的光线取样参考。Unity需要每张图表的边缘至少有4个texel,方便在缝合不同光照图时有对照的依据。

要注意的是使用实时GI时不需要自己去填这些UV的边,因为Unity在处理网格汇入的流程时,会自动将光照UV图向内挤出一个边框的空间。这样就能让相邻的图表无需做渗色处理,也能保持双线性插值(Bilinearly Interpolated),能节省宝贵的光照贴图空间。

光照图如何影响计算时间?

要弄清楚这个问题,我们可以试想一下: 1x1对象如果带有50张光照图,Unity会为它创建800个texel。尽管这个数字看上去不是很大,但说明了当图表的量一大就会快速拉高texel的量。越多的贴图像素意味着更为繁重的光照运算要处理,更多的光照数据要计算、压缩和储存,这些因素都会提高场景的复杂度,并导致运行时长时间的计算和较低的效率。

不合理的光照图规划一般是导致计算耗时过长或无法完成的主因。也因为如此,我们许多减少计算时间的方向大多都是思考如何降低场景内光照图的数量。

总结

本文抛砖引玉,主要是为大家提供一个通过光照图的数量控制来影响计算时间的思路,希望读后的你可以进一步思考,在自己的项目中如何进行进一步的应用。后续我们会继续分享有关预计算实时GI的技术知识,敬请期待!