將頂點著色網格轉換為貼圖網格
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)
貼圖轉換的技術流程
對於手動實作轉換的人員,該流程包含多個離散的幾何與影像處理步驟,以將頂點資料轉換為 2D 圖像映射。
UV 映射生成與重新映射
此流程使用 xatlas 函式庫生成 UV 映射。這是整個過程中計算量最大的部分。UV 映射生成後,會將頂點與頂點顏色重新映射至新的 UV 座標,並相應更新網格面。
透過重心插值填充貼圖緩衝區
為了產生貼圖,系統會建立一個貼圖緩衝區(通常放大 2 倍以提升品質),並使用以下邏輯填充:
- 重心插值:使用三個頂點的顏色計算三角形內特定點的插值顏色。
- 點在三角形測試:判斷貼圖緩衝區中的特定像素座標是否位於由網格面 UV 座標定義的三角形內。
- 填充迴圈:系統遍歷每個面,確定其在貼圖緩衝區上的邊界框,並使用點在三角形測試將插值顏色指派給相應的像素。
貼圖精練與後處理
初始貼圖生成常會產生「洞」或雜訊。為了解決此問題,流程會套用四個連續的影像處理技術:
- 修補:使用
cv2.inpaint以周圍像素的平均顏色填補洞洞。 - 中值濾波:透過以鄰域像素的中值顏色取代來去除噪點。
- 高斯模糊:平滑貼圖以消除剩餘噪點。
- 降採樣:使用 LANCZOS 重取樣將圖像縮放至最終所需的貼圖尺寸(例如 1024x1024)。
最終網格構建與限制
當精練的貼圖生成後,會使用 trimesh 建立 PBRMaterial,將生成的圖像指定為 baseColorTexture。接著使用 TextureVisuals 並套用生成的 UV 座標將此材質應用於網格。
目前限制
雖然此方法提供了快速的轉換途徑,但仍有已知的限制:
- 雜訊:生成的網格仍可能包含小的視覺雜訊。
- 製作品質:生成的 UV 映射與貼圖品質目前仍低於專業製作就緒網格的標準。
此方法旨在為需要快速將頂點著色生成輸出轉換為標準貼圖格式的使用者提供實用工具。