DirectUV:UV 纹理扩散,接缝对上了,UV 展开质量差就糊
DirectUV 把 3D 网格纹理生成整个搬进 UV 潜空间,用冻结的 Flux VAE 做潜表示、用 Diffusion Transformer 做去噪,再让一套由表面坐标驱动的旋转位置编码决定 token 之间谁是谁的邻居。这套位置编码叫 SAPE(Surface-Aware Positional Encoding)。它要解决的事只有一件:让被 UV 接缝分到不同岛上的 texel,在去噪过程中就能直接互相注意。代价写在论文自己的结论里,模型依赖 UV 参数化质量,局部展开病态时会糊。
1 两条路线的共同卡点:几何从没进入 UV 空间的注意力本身
现有两条路线都没有让 UV 空间里的注意力按表面邻近度工作,所以缺的不是又一个 3D 模块,而是几何进入注意力的那个入口。
先把错配说清楚。UV 展开把曲面摊平成一张图,接缝是不得不切开的边界。网格上紧邻的两个 texel 可能正好落在接缝两侧,被分进互不连通的 UV 岛,在 UV 网格度量下相距任意远;反过来,UV 平面上挨着的两个 texel 也可能对应表面上相距很远的区域。DirectUV §3.4 把后果写得很直白:2D 网格为注意力提供了错误的邻域先验,跨接缝与跨不连通区域的一致性因此受限DirectUV.
这件事之所以落在位置编码上,是因为条件信号可以被模型选择性地关注或忽略,位置编码不行。RoPE 把位置信息直接注入 query-key 交互,于是它定义的是注意力被迫依据的距离度量,在整个去噪过程中固定了谁被视为邻居。DirectUV 的引言正是用这句话说明自己为什么选这个入口。
渲染管线里有一个长得一样的老问题,可以拿来对照。烘焙好的 lightmap 被切开后,接缝一侧的像素在贴图上找不到另一侧的邻居,采样时会把背景色渗进来,这就是接缝渗色;工程上的补法是 dilation,把边缘像素向外扩几圈,硬造出一圈假邻居。补边是在结果上事后修补,DirectUV 要做的是把同一件事提前到注意力所依据的度量里:让接缝两侧的 texel 在去噪时就天然互为邻居,而不是等纹理生成完再补。
第一条路线是多视角投影加烘焙。它借 2D 扩散先验合成多视角图像,再投影、烘焙、修补成表面纹理。问题出在有限数量的视角覆盖不到遮挡区与掠射角区,而投影与烘焙阶段还必须调和不同视角之间的失配信号,误差因此累积成接缝、错位与局部塌陷。RomanTex 把这条范式的病灶写得更具体:多视角图像之间的不一致会在烘焙阶段变成 seams 与 ghosting,背面与自遮挡区域覆盖不足,几何条件与图像条件错配还会造成颜色渗漏RomanTex. Hunyuan3D-2.1 的 Paint 模块已经把 RomanTex 的 3D-aware RoPE 接进了 multiview attention block,但 3D 感知仍然在多视角图像网格上被消费掉,之后还要投影回表面,论文正文里并没有烘焙这一步,烘焙只出现在官方实现中Hunyuan3D-2.1.
第二条路线是直接在 UV 空间生成。它从构造上避开了投影伪影,但几何通常靠辅助模块塞进去。TEXGen 是个清楚的例子。

图注:TEXGen 的混合 block 结构。panel (c) 的 UV head block 是 1×1 Conv 到 3×3 Conv 的纯卷积栈,没有任何几何感知的位置偏置;位置编码 sCPE 只出现在 panel (d) 的点云 block 里。也就是说几何是在点云分支内部被消费的,UV 侧算的仍然是 2D 卷积,它并不知道网格拓扑。TEXGen
TEXGen 的几何要走完一整趟往返:UV 特征先被光栅化抬到三维,grid-pooling 稀疏化成点特征,做完分组自注意力再 scatter 回稠密坐标,最后与 UV 特征按门控尺度融合TEXGen。把 3D 感知写进位置编码的做法此前也不是没有,RomanTex 就把体素索引写进了旋转相位,但它作用在多视角图像网格上,属于第一条路线内部的改良。
两条路线于是各缺一半。投影式把几何在视角空间用完就丢掉,UV 直接式把几何外挂成一条独立分支。共同点在于,UV 空间里的注意力始终按 UV 距离算邻居。
2 UV 图是唯一的生成目标,投影结果只当条件、不当要修补的中间结果
DirectUV 把生成目标缩到只剩一张 UV 图,参考图像与粗糙 UV 图全部降级为条件,这样既用上了多视角线索,又不继承视角不一致。
潜表示直接复用预训练图像 VAE。UV 图被冻结的 Flux VAE 编码为空间下采样的潜变量 $x = E(I_{UV})$,规格是 8 倍下采样、64 个潜通道,所有去噪都在这个表示上完成,最后由 $D$ 解码。这一表示与预训练的 2D 图像先验天然对齐,而 VAE 重建 UV 图的误差可以忽略。
训练侧的数据流可以按四个箭头走。干净潜变量 $x$ 加噪成 $z_t$ 后,与冻结 VAE 编码的粗糙 UV 潜变量在 patchify 之前沿通道维拼接,在 patchify 层形成 128 个输入通道与 64 个输出通道。参考图像分两路进入:CLIP 的 pooled 特征走 Flux 里原本用于时间步与文本嵌入的 AdaLN 调制路径,对全部 token 统一给条件;DINOv2 的稠密 patch token 进入联合注意力流,实际上顶替了原架构的文本 token 位。这里要按原文说清一点,DirectUV 是纯图像条件,不接文本。第三路是粗糙 UV,它因为与目标纹理共享 UV 坐标系,才走位置对齐的通道拼接。网格单独栅格化成 CCM(Canonical Coordinate Map),这张 UV 空间图像每个像素存的是对应网格点的 3D 坐标,每个网格只预计算一次,经 Rasterize CCM 后只连到 RoPE coords 那条虚线。

图注:DirectUV 的总览图,上为训练、下为推理。训练侧能看到三条条件路径分别落在不同位置:CLIP pooled 进 AdaLN、DINOv2 patch token 进联合注意力、粗糙 UV 与带噪潜变量在 patchify 前通道拼接;CCM 经 Rasterize CCM 只引向 RoPE coords。推理侧参考图像驱动现成的多视角生成器,输出经 Project to UV 得到粗 UV,$z_T$ 经 Euler 迭代得到 $z_0$,再由冻结 VAE 解码并包裹到网格上。DirectUV
训练目标是 rectified flow matching。给定干净潜变量 $x$、噪声 $\epsilon \sim \mathcal{N}(0, I)$ 与 $t \in [0,1]$,构造 $z_t = (1-t)x + t\epsilon$,网络回归从噪声指向数据的直线方向:
$$ \mathcal{L}\theta = \mathbb{E}{t,x,\epsilon,c}\left[, w(t),\big\lVert v_\theta(z_t, t, c) - (\epsilon - x) \big\rVert_2^2 \right], \qquad w(t) \equiv 1. \tag{2} $$
条件束 $c$ 不包含 CCM,CCM 只通过 SAPE 进入模型。这也是它和"把坐标拼进通道"最根本的区别:能被拼进通道的坐标,和被拿去定义距离的坐标,是两件事。推理时粗糙 UV 由参考图像过一遍现成多视角生成器再投影得到,CCM 由网格一次性栅格化,条件束与 CCM 在各步之间确定可复用,从 $z_1 \sim \mathcal{N}(0,I)$ 出发做 28 步 Euler 更新,调度器为 FlowMatchEulerDiscreteScheduler。
粗糙 UV 只是软条件。附录 A 的键盘例子把这一点讲得很清楚:粗糙 UV 把机箱底面渲染成白色,但参考图像与周围表面都说明那是一整块深色金属,最终纹理按全局推理把底面恢复成深色金属,覆盖了粗糙 UV 的数值。Table 3 只在投影已覆盖的像素上比较,排除掉填补空洞带来的收益后仍有 +1.11 PSNR、+0.0301 SSIM 的提升,说明它是在修正投影数值,而不是复制。
3 把头维切成三段各转各的,位置量就能从网格下标换成任意三维坐标
从二维走到三维,改的不是旋转算子,而是两件事:位置量是什么,以及特征维怎么分给各个轴。
二维 RoPE 的出发点是让内积只通过相对位置携带位置信息,即要求 $\langle f_q(x_m,m), f_k(x_n,n)\rangle = g(x_m, x_n, m-n)$。它的解把旋转放在线性投影之后、作用在 query 与 key 上:
$$ f_{{q,k}}(x_m, m) = R^d_{\Theta,m}, W_{{q,k}}, x_m, $$
其中 $R^d_{\Theta,m}$ 是由 $d/2$ 个 $2\times 2$ 旋转块组成的块对角矩阵,第 $i$ 块转 $m\theta_i$ 角,频率集合为 $\Theta = {\theta_i = 10000^{-2(i-1)/d}}$。于是 $q_m^{\top} k_n = x^{\top} W_q^{\top} R^d_{\Theta,n-m} W_k x$,内积里只剩位置差。这里要钉准一个口径:旋转矩阵夹在 $W_q^{\top}$ 与 $W_k$ 之间,旋转作用在投影之后的 q/k 上,而不是先把输入转一遍再投影RoFormer.

图注:二维 RoPE 的实现形态。每个通道对在自己的 2D 子平面上按位置索引 $m$ 与自身频率 $\theta_i$ 旋转 $m\theta_i$ 角,$d/2$ 个子空间各自独立。这张图只用来对齐"通道对各自旋转"这一结构,图中是单轴位置索引,没有多轴结构。RoFormer
多轴推广的关键一步是把位置量从标量换成元组。M-RoPE 把原旋转嵌入拆成 temporal、height、width 三个分量,每个 token 携带 $(t,h,w)$ 三元位置 ID,文本输入三个分量取相同值,因此功能上等价于 1D-RoPEM-RoPE。需要如实说明的是,M-RoPE 论文没有给出头维究竟怎么切段、各轴占多少维,[16, 24, 24] 这组连续分段来自官方 Transformers 实现,不是论文主张。

图注:位置 ID 从单一标量升级为三元组。左侧视频帧格子上标的是 $(t,h,w)$,中间文本 token 三个分量取同值。图里没有画头特征维如何被切成三段,也没有画旋转算子与频率,所以它只能说明"位置量变成了元组",不能说明切法。M-RoPE
DirectUV 用的正是连续分段这一形式,但轴换成了表面坐标:第 $h$ 个头的特征维被划分为三个连续分组,分别对应 $\mathcal{S}i$ 的 $(x,y,z)$ 轴,每组由自己的坐标独立旋转。规格上 $d{head}=120$、各轴维度 $(40,40,40)$,三段加起来正好是头维。
和二维版本的差别可以收成一句:切法形式一致,都是连续分段;轴语义完全不同,M-RoPE 的三段是图像网格的时间、高、宽,DirectUV 的三段是三维表面坐标。两者是并行独立的工作,不是同源。论文在此处留给读者的空白也要点明:三个分组各自的频率数量与维度配对方式,原文没有给出。
4 表面坐标当旋转相位,接缝两侧成为邻居;细粒度再分给不同的头
SAPE 的改动小到只有一处:把旋转位置编码里的位置量,从 UV 网格下标换成逐 token 的 3D 表面坐标。
坐标来源是 CCM。把 CCM 下采样到 token 网格的分辨率,使第 $i$ 个 token 覆盖的 UV 区域 $U_i$ 映射到单个 CCM 像素,其值 $\mathcal{S}_i \in \mathbb{R}^3$ 就是该 token 的表面坐标。这一步必须先交代清楚:token 网格是 VAE 8 倍下采样之后的格子,CCM 原来在 1024×1024 的 UV 分辨率上,不下采样就得不到逐 token 的坐标。至于下采样时用均值还是中心采样,论文没有给出。
对第 $h$ 个头里任意一对 token,SAPE 这样旋转它们的 query 与 key:
$$ \tilde{Q}_i^{(h)} = \mathrm{RoPE}\big(Q_i^{(h)}; \mathcal{S}_i\big), \qquad \tilde{K}_j^{(h)} = \mathrm{RoPE}\big(K_j^{(h)}; \mathcal{S}_j\big). \tag{1} $$
内积的解析式可以直接写出来。三个分组是各自平面里的二维旋转,绕同一根轴的两个旋转相乘等于角度相减,所以
$$ \big\langle \tilde{Q}_i^{(h)}, \tilde{K}_j^{(h)} \big\rangle = Q_i^{(h)\top} R(\mathcal{S}_i)^{\top} R(\mathcal{S}_j) K_j^{(h)} = Q_i^{(h)\top} R(\mathcal{S}_j - \mathcal{S}_i) K_j^{(h)}. $$
每个分组贡献的是自己那根坐标的差值,于是整个内积只依赖 $\mathcal{S}_j - \mathcal{S}_i$,与 2D UV 网格无关。被接缝分到两个岛上的两个 token,只要在曲面上相邻,在这个度量下就是邻居。论文在这一步只给了结论式,三组频率如何配对维度确实没有展开。

图注:左半是 SAPE 的几何含义。token $i$ 与 token $j$ 在网格上相邻,却被一条 UV seam 分到不同 UV 岛,图中用紫色带标出它们之间的 surface-aware relation,虚线箭头把 UV 平面上的两个 token 映射回 3D 曲面的对应位置。右半是 Multi-Level 的逐头分配,Level 0 为 1×1 且所有头共享,Level 1 为 2×2,Level 2 为 4×4,四个 head group 每组 6 个头依次读 L0、L1、L2、L2、L2、L2。DirectUV
把几何放进位置编码而不是条件分支,还有一条外部旁证。PE-Field 的定性实验把 DiT 的 2D 位置编码空间重排后,解码或生成的结果仍保留全局语义,例如仍是一张可辨的人脸,但会出现与新布局对齐的块状断裂PE-Field。这说明空间一致性主要由位置编码支配,内容交互不是唯一来源。这条证据是定性的,没有量化指标,也不是对所有 DiT 的普适定律。
单个逐 token 坐标只到 patch 级粒度,跨岛对应能解决,patch 内部的细节仍会塌。Multi-Level SAPE 在同一潜块上读 $L$ 种分辨率:第 $l$ 层把 patch 细分为 $2^l \times 2^l$ 的布局,每个 token 产出 $4^l$ 个子单元的坐标 $\mathcal{S}_i^{(l)}$,基础 SAPE 就是 $l=0$。
分配规则落在多头结构上。一个头的特征维被切成 $H$ 个大小为 $d_{head}$ 的连续切片,每个头被指派一个层级 $l_h$ 与该层内的一个具体子单元,旋转中的 $\mathcal{S}_i$ 换成头专属的 $\mathcal{S}_i^{(l_h)}$。$H$ 个头分成 $G$ 组,每组绑定 level-1 布局里的一个子单元;组内在 $L=3$ 时是一个头读 level-0、一个头读该组的 level-1 子单元、另外四个头读嵌套其中的四个 level-2 子单元,实际取值 $L=3$、$H=24$、$G=4$、每组 6 个头,各层的头预算因此是 4:4:16。关键是每个头只拿一个 CCM 坐标,不是把多个层级堆叠在同一个头里;多层证据是在注意力下游由输出投影混合的,注意力内部每个头仍在干净的单一粒度下推理。这套东西不引入额外潜变量图、参数或几何分支。
用渲染管线的说法,它像 mipmap 链。同一张纹理预先存好几个分辨率层级,粗级保留整体结构,细级补局部细节,需要哪一级就用哪一级;Multi-Level SAPE 读的是同一份 CCM 的几级,粗级给跨岛的宏观对应,细级给 patch 内的几何变化。区别在于 mipmap 按屏幕像素密度动态选级,这里是把层级固定绑定到头上。好处是不用新建一份数据,代价只落在延迟上。Table 9 里 512² 分辨率下 2D UV RoPE 是 13.06 s,Multi-Level SAPE 是 13.38 s,峰值显存 15.20 GiB 不变;1024² 下从 35.99 s 到 36.40 s,显存 18.04 GiB 不变。SAPE 没有可学习参数,改变的只是传给现有旋转嵌入的坐标。
5 同一批表面坐标,进位置编码才有效,拼进通道几乎没动
增益能归因到两处设计上,注入位置和多层级粒度,而不是"模型见到了 3D 坐标"这件事本身。
主证据是一组受控对比。同一骨干、同一训练集、同一条件流程,只改 CCM 进入模型的方式:
| 变体 | 几何注入方式 | PSNR ↑ | SSIM ↑ | FID ↓ | KID ↓ |
|---|---|---|---|---|---|
| w/o SAPE (2D RoPE) | 无 | 23.82 | 0.9376 | 58.42 | 72.36 |
| CCM 拼接 + 2D RoPE | 潜通道拼接 | 23.97 | 0.9395 | 50.62 | 66.68 |
| Single-Level SAPE | CCM 坐标进入 RoPE | 24.36 | 0.9462 | 40.86 | 36.74 |
| Multi-Level SAPE | 多层级 CCM 坐标进入 RoPE | 25.13 | 0.9527 | 39.17 | 30.03 |
把坐标拼进通道,PSNR 只从 23.82 挪到 23.97。同样的坐标拿去定义位置关系,单层级就到 24.36,多层级到 25.13DirectUV。论文对差距的解释是,拼进通道的骨干必须自己隐式推断 UV token 之间的坐标关系,而位置编码直接把这层关系写进了注意力的度量。这张表与 SAPE 消融表里的 single 与 multi 两行是同一组数,读一次即可。
接缝区的数据把这条线钉得更死。以真值为参照的接缝差异从 0.18 降到 0.14、0.10、0.09,接缝 PSNR 从 11.30 升到 12.11、16.70、21.35。论文自己提醒这类分数只作相对比较读,因为接缝邻域是细窄的高频条带,绝对数值本来就远低于全局指标,较低的 2D RoPE 基线恰好反映的就是 SAPE 要解决的失效模式。
定性上的两级失效对得上。去掉 SAPE,在 3D 表面上相邻却被分到不同 UV 岛的 texel 无法正确交互,chocobo 一例里腿部的黑色纹理被生成到了脖子上;只去掉多层级,跨岛一致性还在,但纹理变糊,因为所有头读同一份逐 token 坐标时,注意力分不清潜块内部子 token 的位置,patch 内细节在解码后塌成近乎均匀的外观。

图注:SAPE 的定性消融网格。列自左至右是输入、完整 Multi-Level SAPE、去掉多层次的 SAPE、完全去掉 SAPE。第三列还能维持跨岛的一致外观但细节变软,第四列出现整体外观偏离。图中不含任何指标数值,定量结论要回上面的表格。DirectUV
增益落在哪块区域也做了分项。相同区域掩码下相对 2D UV RoPE 基线,多层级在可见表面提升 +1.14 PSNR,在视角未覆盖表面提升 +1.39 PSNR。最大增益恰好出现在粗糙 UV 不提供任何投影证据的地方,所以这些提升无法由那条条件解释。

图注:与四个基线的定性对比,5 行物体乘 6 列方法,最后一列是 DirectUV。论文用三处差异讲这张图:数字块上的高频笔画更锐利;水井内壁与垃圾桶内部这类遮挡区域给出连贯内容;风扇一例中 DirectUV 不会被相互冲突的视角误导。图里没有指标数值,定性差异不能读成 PSNR 差距。DirectUV
风扇一例要加一层限定。把后盖纹理转移到前叶片上是 DirectUV 对 UniTEX 的定性观察,机制解释来自 UniTEX 的流程结构:它把投影得到的像素既当作 Large Texturing Model 的输入,又在最后与预测的纹理函数混合,投影像素因此是被保留的已知内容,而不是需要重新生成的条件,视角冲突会被继承而不是消解UniTEX。UniTEX 论文本身没有讨论这个案例。
需要按论文口径说明的一点是,论文没有报告误差棒,Table 4 里 25.11 与 25.13 这类差距只有 0.02 dB,这种量级的差距解释力有限,不宜写成稳健优势。
6 扛得住几万个 UV 岛,扛不住病态的局部展开
它能容忍很高的 chart 数量、容忍不完整的粗糙 UV,也能直接吃生成式网格自动导出的 UV;真正卡住它的是 UV 参数化本身的局部质量。
先看它能容忍什么。按岛数分桶后,GSO 上岛数超过 10 的各组 PSNR 在 25.73 到 28.27 dB 之间,并不随岛数单调退化;最低的 23.19 反而落在岛数最少的 1 到 10 组。在训练时留出的 TexVerse 子集上,覆盖 1 万到 5 万以上岛的三个桶 PSNR 在 26.00 到 28.57 dB 之间。PSNR、SSIM、LPIPS 都没有随岛数增加而一致变差,说明在测试范围内它对 chart 数量层面的碎片化是稳的。Table 4 则说明粗糙 UV 的完整度也只是软条件:零视图、粗糙 UV 完全空白时仍有 23.07 dB,一个视图就到 25.08 dB,此后 PSNR 与 SSIM 基本饱和,FID 与 KID 继续改善。

图注:在图像到 3D 形状生成器产出的网格上生成纹理,每个物体给一张参考图与多视角渲染结果。这些网格用的是各平台自动导出的 UV 参数化,没有重新展 UV,也没有岛合并、接缝修复或碎片删除。它说明 DirectUV 能直接落进"图像到带纹理网格"的生产流程。
真正卡住它的是另一种情况。在由许多小碎片与角落 patch 组成的高度碎片化 UV 布局上,逐 token 表面坐标 $\mathcal{S}_i$ 会为每个碎片聚合相对较大的表面区域,得到的 CCM 信号变粗,多层级细分也补不回细粒度细节,包裹后的纹理出现模糊与颜色渗漏。论文把成因归到 UV 参数化与网格质量,而不是 SAPE 的设计,并把面向 UV 的预处理、面向 UV 空间数据联合学习 tokenization 策略列为下一步方向。结论原话是这套方法对 UV 参数化质量存在依赖。
这里的区分值得记住:岛数多不是问题,病态的局部 chart 几何才是。把这两件事分开,前面按岛数分桶的稳健性和这里的失效案例就不矛盾了。
评测口径按论文交代如下。评估在 Google Scanned Objects 上随机采样的 200 个物体上进行,与训练数据不相交,每个物体渲染单张正视图作为所有方法的参考输入。正文与检查表在物体数上给出了两种表述,引用时按随机采样这一口径更稳妥。
参考文献
本专题引用的核心资料如下,建议深入学习时阅读原文:
- DirectUV: Image-Conditioned UV Texture Generation with Surface-Aware Positional Encoding — arXiv:2609.34651
- RoFormer: Enhanced Transformer with Rotary Position Embedding — arXiv:2104.09864
- Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution — arXiv:2409.12191
- RomanTex: Decoupling 3D-aware Rotary Positional Embedded Multi-Attention Network for Texture Synthesis — arXiv:2503.19011
- Positional Encoding Field — arXiv:2510.20385
- TEXGen: a Generative Diffusion Model for Mesh Textures — arXiv:2411.14740
- Hunyuan3D 2.1: From Images to High-Fidelity 3D Assets with Production-Ready PBR Material — arXiv:2506.15442
- UniTEX: Universal High Fidelity Generative Texturing for 3D Shapes — arXiv:2505.23253