我们常常在Unity3D中第一次测试烘焙光影之后,会发现很多黑斑(边)、亮斑(边)、硬边(撕扯)、漏光、破面、亮面等缺陷和模糊的光影(如下图所示),此时一些童鞋就慌了神了,回到建模软件中仔细检查之后确认模型没问题,然后在Unity中一通乱调,烘焙时间比第一次更长,漫长的等待之后终于烘焙完了,可是问题依然存在。
小姐姐在《Unity3d光影烘焙常见缺陷的解决方法》一文中提到,要解决上述缺陷,可分别选中有缺陷的物体,然后适当加大每个有缺陷物体对应的Scale In Lightmap参数(如下图所示),那到底适到什么程度才算当呢,网上一些人甚至建议把这个值调到一两百,于是很多童鞋就抹黑使劲加大这个值,其实这个建议纯粹是胡扯,要知道该调多大,首先要搞清楚这个值的本质是什么?这个值实际上是这个物体在光影图中的相对大小,加大这个值等于在放大这个物体的光影图,每个有缺陷的物体都无度地加大这个值,此时单张光影图会增大到下面第二张图所示的光影图的最大尺寸,同时受这个最大值的约束,光影图的数量会急剧上升(这里还需要考虑,因为一些物体的比例增大,导致在原有的光影图中装不下,会被排挤到另一张光影图中,而原有的光影图中的位置会被空下来,造成一张大的光影图中被空出一大块空间,如果被排挤出的物体的光影图块越多,空出的空间越多,因为Unity还做不到完全智能地利用所有UV空间,所以这是一种恶劣的资源浪费),让Unity渲染烘焙几倍甚至几十倍上百倍数量且很大的光影图,不慢才怪呢,另一方面,光影图尺寸的无端加大和数量的增多,会给Unity作品的实时运行会带来灾难性的挑战。
上面说到有缺陷物体的Scale In Lightmap值不能随意加大,但是没有根据又怎么调呢,要确定如何来调这个数值,先按下图所示步骤,将场景视图切换为烘焙的光影图(Baked Lightmap)模式,在这个模式下(建议烘焙后使用这种模式),Unity形象地用棋盘格表示每个物体的光影图图块在其所在光影图中的相对分辨率(也就是大小),棋盘格越密,表示这个物体烘焙后的光影图图块(也称子光影图,一张光影图由若干个物体的子光影图拼合而成)在其所在的光影图中越大,越稀疏则反之。光影图图块越大,表示可以展现的细节越多,这个物体上的光影越清晰。光影图图块越小,很多光影细节无法展现,物体的光影越模糊,严重者就出现了一开始提到的各种缺陷,物体上本来比较暗的光影,是有明暗过渡的,可是由于被分配的光影图图块太小,明暗过渡在很小的光影图块上会被聚合成黑块,回贴到模型上必然就是黑斑。物体上比较亮的光影,也是有明暗过渡的,也会类似地被聚合成亮块,回贴到物体上时必然就是亮斑。至于破面,实际上是光影图的alpha通道(光影图是有Alpha通道的)中的黑色部分错误聚合穿透了物体。其他缺陷实际上是黑斑和亮斑的不同形态而已。
需要说明的是,当物体的Scale In Lightmap值加大或减小的时候,在烘焙的光影图模式下,物体在场景视图中对应的棋盘格会跟着变密或变疏,有了这样的对应关系,我们就可以不用再摸黑地胡乱调了,场景中总有烘焙的比较好且没问题的物体,选中有问题的物体,拖动其Scale In Lightmap的滑杆,稍微加大一点,用肉眼就可以看到和没问题物体的棋盘格差不多大小(密度)了,而不至于一下子调了很大,另外对于一些没问题的物体,稍微降低一些Scale In Lightmap值,让其棋盘格稍微变大一点,光影有时也还是清晰无误的,这是为了给有问题的物体让出一些UV空间,这样有增有减来平衡光影图数量的增加和光影图尺寸的加大,如下图所示:
对于场景中不重要的物体(比如被挡在重要物体之后不需要刻意表现光影的),光影模糊一些不影响大局的,可以降低这些物体的Scale in Lightmap值,如下图中最后面的墙面。
参照没问题物体的棋盘格,可视化地调节有问题物体的Scale in Lightmap数值,不仅可消除光影烘焙的缺陷,提高烘焙质量,还可通过减少光影图的数量加速烘焙。希望小姐姐这篇文章能对童鞋们提高光影烘焙质量和加速烘焙有所帮助。