【Unity3D技术文档翻译】第3.6.2.3篇 UV重叠结果(
上一章:【Unity3D技术文档翻译】第3.6.2.2篇 光照贴图接缝缝合(Lightmap seam stitching)
本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Global Illumination】→【Progressive Lightmapper】→【UV overlap feedback】
UV重叠结果(UV overlap feedback)
每张光照贴图都包含了一些图表(charts)。在运行时,Unity 将这些图表映射到网格表面,然后利用它们的光照数据计算最终的外观效果。由于 GPU 采样的工作方式,如果图表相互靠得太近,那么一个图表上的数据可能会渗透到另一个图表上。这通常会导致意料之外的锯齿、像素感,以及其他的图像效果(这些被称为人造效果)。
由于图表的相互渗透而产生的人造图像效果为了避免灯光渗透,图表之间就必须具有足够的空间。当 GPU 对一张光照贴图采样时,光照系统将对采样点周围最近的四个纹素(texels)进行采样,从而计算得出最终的采样值(假设使用的是双线性(bilinear)过滤)。这四个纹素被称为采样点的双线性“相邻纹素”。如果纹素相互重叠,就说明图表靠得太近了——即:一个图表上任意一点的相邻纹素,与另一个图表上任意一点的相邻纹素重叠了。在下图中,白色像素代表了图表的相邻纹素,而红色像素代表了重叠的相邻纹素。
红色像素代表了图表中重叠的相邻纹素决定图表的最佳布置和间隔比较困难,因为牵涉到一些参数设置(比如光照贴图分辨率、网格 UVs 和导入设置)。因此,Unity 提供了简单识别这些问题的功能,下面几部分将介绍这些内容。
识别
有三个方法识别重叠:
-
看一眼 Unity 的 console 窗口。如果 Unity 检测出重叠的 UVs,它会打印一个附带受影响游戏对象列表的警告信息。
-
在 Scene View 中开启 UV Overlap 绘制模式。当你开启该模式后,Unity 将为那些与其他图表纹素靠得太近的纹素添加红色高亮。如果你法线场景视图中有个人造效果,并且想要快速检查是否是 UV 重叠造成的,那么这个方法就很有用。
- 使用 Lighting 标签页中的 Object Maps。选中一个对象,进入 Lighting 标签页并选择 Object Maps。确保在下拉选项中选择了 Baked UV Overlap。在该视图中,有问题的纹素会被标记为红色。
解决方案
对于 UV 重叠,没有单一的解决方案,因为导致它的原因有很多。这里有一些最常用的解决方案以供参考:
- 如果是 Unity 自动创建的光照贴图 UVs,那么你可以增加 Pack Margin。导航到 Mesh 的 import settings 窗口,确保 Generate Lightmap UVs 已被开启,然后展开 Advanced 属性,使用 Pack Margin 滑动条来增加该值。 这会增加图表间的间隔,进而减少重叠的可能性。然而,这同样会增加光照贴图所需的空间占用,因此要尝试应用足够避免人造效果的值,但是又不能太大。想要了解更多关于 Unity 自动创建光照贴图 UVs 的信息,请查看 Generating lightmapping UVs 一节。
- 如果是你自己提供的光照贴图 UVs,你可以尝试使用你的模型打包工具来增加间隔。
- 增加整个光照贴图的分辨率。缺点就是你的光照贴图可能变得非常大。你可以在 Lightmapper Settings 下的 Lighting 标签页下设置该属性。
- 增加单个游戏对象的分辨率。这将只增加具有重叠 UVs 游戏对象的光照贴图分辨率。虽然可能性较小,这也可能会增加光照贴图的大小。你可以在游戏对象的 Mesh Render 中的 Lightmap Settings 属性下更改光照贴图分辨率。
如果本文对你有帮助的话,点个赞或者评论一下吧!