Unity3D:修复光照贴图 UV 重叠

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
修复光照贴图 UV 重叠
每个光照贴图都包含多个图表。在运行时,Unity 将这些图表映射到网格面上,并使用图表的照明数据来计算最终外观。由于 GPU 采样的工作方式,如果一个图表中的数据彼此靠得太近,它们可能会流失到另一个图表上。这通常会导致意外的伪影,例如混叠、像素化等。

为避免光渗,图表之间必须有足够的空间。 当 GPU 对光照贴图进行采样时,光照系统会从最接近采样点的四个纹理像素计算最终采样值(假设使用双线性过滤)。 这四个纹理像素称为采样点的双线性“邻域”。 如果图表重叠(也就是说,如果图表中任何点的邻域与另一个图表中任何点的邻域重叠),表示图表太靠近。 在下图中,白色像素表示图表邻域,红色像素表示重叠的邻域。

确定最佳图表放置位置和间距可能会很困难,因为它取决于多个参数(例如光照贴图分辨率、网格 UV 和导入器设置)。 基于此原因,Unity 提供了轻松识别这些问题的能力,如以下部分所述。
识别
有三种方法可识别重叠:
- 密切关注 Unity 的控制台。 如果 Unity 检测到重叠的 UV,它会打印一条警告消息,其中包含受影响游戏对象的列表。
- 使用 Scene 视图中的 UV Overlap 绘制模式(有关更多信息,请参阅 Scene 视图中的 GI 可视化)。 启用此模式后,Unity 会以红色突出显示图表中的哪些像素纹理过于靠近其他图表中的纹理像素。 如果您在 Scene 视图中发现瑕疵,并希望快速检查是否由 UV 重叠导致了此问题,则此方法尤其有用。

- 使用 Baked Lightmaps Preview。 选择一个游戏对象,前往 Lighting 窗口,然后选择 Baked Lightmaps 选项卡。 双击突出显示的光照贴图,导航到 Preview 窗口,然后选择 __Baked UV Overlap__(请查看右上角的下拉选单)。 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 中更改游戏对象的光照贴图分辨率。

由3D建模学习工作室整理翻译,转载请注明出处!