烘焙贴图总有接缝?先别加填充,先测射线距离

烘焙贴图总有接缝?先别加填充,先测射线距离

接缝的两个来源:未命中与外泄

烘焙时,程序把低模表面划分成一个个纹理像素,每个像素对应一次射线发射。射线通常从低模表面出发,沿顶点法线或自定义Cage方向前进,目标是命中高模并记录该点的法线、遮挡或颜色信息。如果某条射线在限定距离内没有碰到任何高模,这个像素就会被标记为背景色、黑色或透明,烘焙结果中出现空洞。

UV岛边缘的像素因为靠近边界,最容易出现未命中。另一类接缝来自采样外泄:不同UV岛之间必须留出间距,否则高分辨率下可能串色;即使间距足够,如果没有做边缘填充,纹理过滤和Mipmap采样仍可能越过UV边界读到透明区域。

Mipmap层级越高,像素压缩越厉害,边缘几个像素的信息会混合到更小区域。所以填充不足的问题在远处或斜视角下尤其明显。

一个测试判断问题类型

把边缘填充临时设为0,把射线距离提高到一个明显偏大的值,再烘焙一次:

  • 接缝消失 → 原本是射线距离不足(几何未命中);
  • 接缝仍在但边缘颜色变了 → 需要调整填充与UV布局(采样外泄)。

这个顺序比直接拉高填充可靠得多。先判断类型,再动参数,能省掉大量反复试验。

边缘填充:值不是越大越好

边缘填充也叫 Dilation、Padding 或 Bleed,操作思路是把UV岛边缘已有像素的颜色向外复制若干圈。例如1024分辨率的贴图设置8像素填充,UV岛外侧8个像素范围会被最近边缘的颜色填满,纹理过滤时采样点即使略微越过边界,读到的仍接近岛内颜色。

贴图分辨率建议填充像素
256—5124—6 像素
10246—10 像素
2048 及以上8—16 像素

过大的填充会让细小UV岛被外围颜色覆盖,边缘发糊、细节丢失,曲率大的位置还会出现拉扯。以上范围需结合Mipmap级别调整——每降一级,贴图尺寸减半,边缘像素影响范围翻倍。

工具命名差异:Substance Painter 叫 Padding,Marmoset Toolbag 叫 Edge Padding,Blender Cycles 烘焙里叫 Bleed,xNormal 也可直接设 Edge padding。本质都是同一种像素扩张。

要明确一点:边缘填充只解决采样越界,无法修复射线未命中的空洞。真正的几何缺失必须从射线距离或Cage网格入手。

前向与后向:把射线拆成两个方向

前向距离是射线从低模表面沿法线向外搜索的最大长度;后向距离是射线向低模背面搜索的最大长度。很多工具把两者合并成一个整体距离,遇到复杂结构时分开设置能减少错误采样。

方向负责什么设置不当的后果
前向距离覆盖低模外侧凸出的高模(如螺丝钉)小于凸出高度时,射线未达高模就停止
后向距离覆盖嵌进低模内部的结构(凹槽、孔洞、内壁)不足时凹槽区域提前结束,烘出黑色或错误法线

设置时参考低模与高模之间的最大偏移量,再加 20%—50% 的余量。余量太小容易漏采样,太大会把背面几何也纳入计算,造成法线反向或颜色污染。

观察包裹是否足够,可以先用一段极简逻辑生成Cage顶点:

def build_cage_point(vertex, normal, front_distance, rear_distance):
    front = vertex + normal * front_distance   # 向外包裹
    rear  = vertex - normal * rear_distance    # 向内包裹
    return front, rear

实际项目中更推荐用Cage网格而不是单一距离值。Cage可按低模顶点法线整体向外膨胀,每个顶点可有不同距离,适合高模局部凸起差异大的情况。Cage距离不够时,接缝同样出现在曲率大的区域,且通常不均匀,边缘呈断续的黑色或亮边。

最稳的排查顺序

第一步:确认UV布局。UV岛间距按目标分辨率与填充像素计算。例如1024贴图计划填充8像素,UV岛之间至少留16像素以上安全距离,避免扩张后的颜色互相混合。

第二步:调射线距离。先按最大偏移量+余量设前向/后向,必要时改用Cage逐顶点控制。

第三步:补边缘填充。最后按分辨率给填充值,配合Mipmap级别微调。

第四步:验证渲染。在远景与斜视角下检查,因为这两个角度最容易暴露Mipmap层面的边缘问题。

一句话总结:接缝不是"填充不够",而是"采样没覆盖"。判断类型 → 修几何包裹 → 再补像素扩张,这个顺序能让接缝在烘焙阶段就消失,而不是留到后期一张张修补。