将顶点着色网格转换为纹理网格

Hugging Face 发布了一份指南和一个配套库 InstantTexture,用于将带有顶点颜色的 3D 网格转换为 UV 映射的纹理网格。此过程至关重要,因为虽然许多生成式 3D 模型(如 InstantMesh)会生成顶点着色的网格,但大多数下游 3D 应用程序在渲染时需要 UV 映射和纹理。

InstantTexture 库用于快速转换

执行此转换的最快方式是使用 InstantTexture 库,它自动化了 UV 映射和纹理生成的技术流水线。

安装与使用

用户可以直接从 GitHub 安装该库:

pip install git+https://github.com/dylanebert/InstantTexture

要将顶点着色的 .obj 网格转换为 UV 映射的 .glb 网格,可使用以下实现:

from instant_texture import Converter

input_mesh_path = "path/to/mesh.obj"
converter = Converter()
converter.convert(input_mesh_path)

纹理转换的技术流水线

对于手动实现转换的用户,过程包括多个离散的几何和图像处理步骤,以将顶点数据转换为二维图像映射。

UV 图生成与重新映射

流水线使用 xatlas 库生成 UV 图。这是整个过程计算量最大的部分。生成 UV 图后,顶点及其颜色会重新映射以匹配新的 UV 坐标,网格面也随之更新。

通过重心插值填充纹理缓冲区

为了生成纹理,系统构建一个纹理缓冲区(通常放大 2 倍以提升质量),并使用以下逻辑进行填充:

  1. 重心插值:使用三角形三个顶点的颜色计算特定点的插值颜色。
  2. 点在三角形内测试:判断纹理缓冲区中的特定像素坐标是否位于由网格面 UV 坐标定义的三角形内部。
  3. 填充循环:系统遍历每个面,确定其在纹理缓冲区上的边界框,并使用点在三角形内测试将插值颜色分配给相应像素。

纹理细化与后处理

初始纹理生成常会出现“孔洞”或伪影。为了解决这些问题,流水线依次应用四种图像处理技术:

  • 修补(Inpainting):使用 cv2.inpaint 通过周围像素的平均颜色填补孔洞。
  • 中值滤波:通过用邻域像素的中值颜色替换像素来去除噪声。
  • 高斯模糊:平滑纹理以消除残余噪声。
  • 下采样:使用 LANCZOS 重采样将图像缩放至最终所需的纹理尺寸(例如 1024x1024)。

最终网格构建与局限性

生成细化纹理后,使用 trimesh 创建 PBRMaterial,并将生成的图像指定为 baseColorTexture。随后使用 TextureVisuals 将该材质与生成的 UV 坐标应用到网格上。

当前局限性

虽然此方法提供了快速的转换路径,但仍存在已知的局限性:

  • 伪影:生成的网格可能仍包含细小的视觉伪影。
  • 生产质量:生成的 UV 图和纹理的质量目前低于专业级、可用于生产的网格标准。

此方法旨在为需要将顶点着色的生成输出快速转为标准纹理格式的用户提供实用工具。

Sources