Each lightmap contains a number of charts. At run time, Unity maps these charts onto mesh faces, and uses the charts’ lighting data to calculate the final appearance. Because of the way GPU sampling works, data from one chart can bleed onto another if they are too close to each other. This usually leads to unintended artifacts such as aliasing, pixelation, and so on.
为避免光渗,图表之间必须有足够的空间。当 GPU 对光照贴图进行采样时,光照系统会从最接近采样点的四个纹理像素计算最终采样值(假设使用双线性过滤)。这四个纹理像素称为采样点的双线性“邻域”。如果图表重叠(也就是说,如果图表中任何点的邻域与另一个图表中任何点的邻域重叠),表示图表太靠近。在下图中,白色像素表示图表邻域,红色像素表示重叠的邻域。
确定最佳图表放置位置和间距可能会很困难,因为它取决于多个参数(例如光照贴图分辨率、网格 UV 和导入器设置)。基于此原因,Unity 提供了轻松识别这些问题的能力,如以下部分所述。
有三种方法可识别重叠:
密切关注 Unity 的控制台。如果 Unity 检测到重叠的 UV,它会打印一条警告消息,其中包含受影响游戏对象的列表。
使用 Scene 视图中的 UV Overlap 绘制模式(有关更多信息,请参阅 Scene 视图中的 GI 可视化)。启用此模式后,Unity 会以红色突出显示图表中的哪些像素纹理过于靠近其他图表中的纹理像素。如果您在 Scene 视图中发现瑕疵,并希望快速检查是否由 UV 重叠导致了此问题,则此方法尤其有用。
UV 重叠没有唯一的解决方案,因为有很多问题可能导致这种情况。以下是最常见的解决方案: