버텍스 색상 메쉬를 텍스처 메쉬로 변환하기

Hugging Face는 버텍스 색상이 있는 3D 메쉬를 UV 매핑된 텍스처 메쉬로 변환하기 위한 가이드와 지원 라이브러리 InstantTexture를 공개했습니다. 이 과정은 매우 중요합니다. 많은 생성형 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배 확대). 그리고 다음 논리를 사용해 버퍼를 채웁니다:

  1. Barycentric Interpolation: 삼각형 내부의 특정 지점에서 세 버텍스의 색상을 사용해 보간된 색상을 계산합니다.
  2. Point-in-Triangle Test: 텍스처 버퍼의 특정 픽셀 좌표가 메쉬 페이스의 UV 좌표로 정의된 삼각형 내부에 있는지 판단합니다.
  3. Filling Loop: 시스템은 모든 페이스를 순회하며, 텍스처 버퍼 상의 경계 박스를 결정하고, point-in-triangle 테스트를 적용해 해당 픽셀에 보간된 색상을 할당합니다.

텍스처 정제 및 후처리

초기 텍스처 생성은 종종 "구멍"이나 아티팩트를 발생시킵니다. 이를 해결하기 위해 파이프라인은 네 가지 순차적인 이미지 처리 기법을 적용합니다:

  • Inpainting: cv2.inpaint를 사용해 주변 픽셀의 평균 색상으로 구멍을 메웁니다.
  • Median Filter: 주변 픽셀의 중간 색상으로 교체해 노이즈를 제거합니다.
  • Gaussian Blur: 텍스처를 부드럽게 하여 남은 노이즈를 제거합니다.
  • Downsampling: LANCZOS 리샘플링을 사용해 이미지를 최종 원하는 텍스처 크기(예: 1024x1024)로 리사이즈합니다.

최종 메쉬 구성 및 제한 사항

정제된 텍스처가 생성되면 trimesh를 사용해 PBRMaterial을 만들고, 생성된 이미지를 baseColorTexture로 할당합니다. 그런 다음 TextureVisuals와 생성된 UV 좌표를 사용해 메쉬에 이 재질을 적용합니다.

현재 제한 사항

이 방법은 빠른 변환 경로를 제공하지만, 알려진 제한 사항이 있습니다:

  • Artifacts: 결과 메쉬에 여전히 작은 시각적 아티팩트가 포함될 수 있습니다.
  • Production Quality: 생성된 UV 맵과 텍스처의 품질이 현재 전문가용 프로덕션 레디 메쉬에 필요한 기준보다 낮습니다.

이 접근 방식은 버텍스 색상 생성 출력물을 표준 텍스처 형식으로 빠르게 전환해야 하는 사용자를 위한 유틸리티로 의도되었습니다.

Sources