Unity预计算全局实时GI(三)- 光照图表(Charts)
在Unity PRGI里,一个光照图表(Chart)是表示一个光照贴图(Lightmap)的区域,这个区域用来映射一个给定场景对象的光照贴图的UV。你可以认为它是能影响对象的一张瓦片图。一个光照图表由两部分组成:辐射度(irradiance)和方向性(directionality)(对主要的光线方向进行编码)
当PRGI被生成时,光照图表里的每个纹素都会被计算光照。一个场景中有大量的光照图表对预计算时间来说是最大的劣势之一,所以为了优化光照预计算时间,理解光照图表的工作原理以及怎么样去管理它们是很重要的。
展示了一个最小规格4*4纹素大小的光照图表的UV。为了阻止由于过滤纹理而导致的泄露,光照图表的四周总是被光照贴图UV多留出半个纹素默认情况下,每个光照图表至少是4*4的纹素大小,不管世界中的对象物体或者对应的UV shell有多大,一个光照图表至少需要16个纹素。因此如果有一个1x1米的对象物体并带有一个光照图表并且我们的间接分辨率是1,那么这个对象物体就需要16个纹素来表现。最小的尺寸使Unity能够将这些图表缝合在一起用于计算模型边缘的无缝光照。Unity需要每张图表的边缘至少有4个纹素,方便在缝合不同光照图时有对照的依据。.
要注意的是使用实时GI时不需要自己去填充这些UV的边,因为Unity在mesh导入管线包装阶段,在截取光照贴图UV时在光照图表的四边上会留出半个纹素。这样就能让相邻的图表无需做渗色处理,也能保持双线性插值(Bilinearly Interpolated),能节省宝贵的光照贴图的空间。
可以想象一下: 1x1米的对象如果带有50张光照图表,Unity会为它创建800个纹素。尽管这个数字看上去相对较小,但说明了当光照图表的数量一大就会快速拉高纹素的数量。越多的纹素意味着更多的光照运算要处理,更多的光照数据需要被计算、压缩和储存,这些因素都会提高场景的复杂度,并导致运行时长时间的计算和较低的效率。
不合理的光照图表规划一般是导致预计算耗时过长或无法完成的主因。也因为如此,我们许多减少预计算时间的明显策略大多都是思考如何降低场景内光照图表的数量。