修复光照贴图中的光渗
每个光照贴图都包含许多__图表__。在运行时,Unity 将这些图表映射到网格面上,并使用图表的光照数据来计算最终外观。由于 GPU 采样的工作原理,如果两个图表彼此距离太近,一个图表中的数据就可能渗漏到另一个图表。这通常会导致意外的瑕疵,例如锯齿、像素化等。
图表渗漏导致的图形瑕疵示例
为避免光渗,图表之间必须有足够的空间。当 GPU 对光照贴图进行采样时,光照系统会从最接近采样点的四个纹理像素计算最终采样值(假设使用双线性过滤)。这四个纹理像素称为采样点的双线性“邻域”。如果图表重叠(也就是说,如果图表中任何点的邻域与另一个图表中任何点的邻域重叠),表示图表太靠近。在下图中,白色像素表示图表邻域,红色像素表示重叠的邻域。
红色像素表示重叠的图表邻域
确定最佳图表放置位置和间距可能会很困难,因为它取决于多个参数(例如光照贴图分辨率、网格 UV 和导入器设置)。基于此原因,Unity 提供了轻松识别这些问题的能力,如以下部分所述。
Identification
有三种方法可识别重叠:
密切关注 Unity 的控制台。如果 Unity 检测到重叠的 UV,它会打印一条警告消息,其中包含受影响游戏对象的列表。
使用场景 (Scene) 视图中的 UV Overlap 绘制模式(有关更多信息,请参阅场景视图中的 GI 可视化)。启用此模式后,Unity 会以红色突出显示图表中的哪些像素纹理过于靠近其他图表中的纹理像素。如果您在 Scene 视图中发现瑕疵,并希望快速检查是否由 UV 重叠导致了此问题,则此方法尤其有用。
使用 UV Overlap 绘制模式的场景视图(查看左上角的下拉选单)
- 使用__烘焙光照贴图预览 (Baked Lightmaps Preview)。选择一个游戏对象,前往光照 (Lighting) 窗口,然后选择__烘焙光照贴图 (Baked Lightmaps) 选项卡。双击突出显示的光照贴图,导航到预览 (Preview) 窗口,然后选择__烘焙 UV 重叠 (Baked UV Overlap)__(查看右上角的下拉选单)。预览窗口在此视图中将有问题的纹素标记为红色。
光照窗口的“烘焙光照贴图”选项卡中的“烘焙光照贴图预览”(Baked Lightmaps Preview)
解决方案
UV 重叠没有唯一的解决方案,因为有很多问题可能导致这种情况。以下是最常见的解决方案:
- 如果由您自己提供光照贴图 UV,可使用建模包添加边距。
- 如果 Unity 自动为模型生成光照贴图 UV,您可以让 Unity 增加紧缩边距。最简单的方法是将__边距方法 (Margin Method)__ 设置为__计算 (Calculate),并设置适当的__最小光照贴图分辨率 (Min Lightmap Resolution) 和__最小对象影响度 (Min Object Scale)。如果想要将__边距方法 (Margin Method) 设置为__手动 (Manual),可以直接调整__紧缩边距 (Pack Margin) 值。如需了解这些设置的更多信息,请参阅有关生成光照贴图 UV 的文档。
- 提高整个光照贴图的分辨率。这样将增加图表之间的像素数量,从而降低发生渗漏的可能性。缺点是光照贴图可能会变得太大。您可以在__光照贴图设置 (Lightmapper Settings)__ 下的__光照 (Lighting)__ 选项卡中执行此操作。
- 提高单个游戏对象的分辨率。这种情况下可以仅为具有重叠 UV 的游戏对象提高光照贴图分辨率。这也可能增加光照贴图的大小,但可能性较小。您可以在__光照贴图设置 (Lightmap Settings)__ 下的网格渲染器 (Mesh Renderer) 中更改游戏对象的光照贴图分辨率。
与先前相同但没有渗漏瑕疵的网格