TL;DR

  • Meshoptimizer 1.3은 복셀 리메싱과 노멀 생성, 메시 단순화 개선을 포함하는 주요 릴리스임.
  • 새 복셀 리메셔 meshopt_remesh는 입력 메시의 위상과 정점 위치를 버리고 주어진 해상도의 복셀 그리드에서 닫힌 메시를 생성함.
  • meshopt_generateNormals는 크리즈 각도 기준으로 스무딩 그룹을 자동 감지하고 선택적 후처리 스무딩을 제공함.
  • 단순화 모드와 옵션을 개선해 퍼미시브 모드를 안정화하고, 양면 지오메트리와 속성 분산이 큰 메시의 처리 방식을 조정함.
  • 라이브러리와 clusterlod.h, gltfpack의 성능·기능 개선 및 버그 수정이 포함되며, 핵심 라이브러리 작업 대부분은 Valve의 후원을 받음.

Meshoptimizer 1.3과 10주년

  • 이번 릴리스는 노멀 생성, 여러 단순화 개선, 소규모 개선과 함께 새로운 주요 기능인 복셀 리메싱(voxel remeshing)을 도입함.
  • 첫 Meshoptimizer 커밋은 2016년 9월 8일에 이뤄졌으며, 이번 릴리스는 10주년보다 조금 늦은 기념 릴리스임.
  • 당시 필요했던 소규모 최적화 알고리즘 모음에서 출발한 라이브러리가 업계 전반의 게임 엔진, 콘텐츠 파이프라인, 도구에서 사용되고 있으며, 압축 형식은 glTF의 일부임.
  • 기존 알고리즘 다수를 연구하고 개선했으며 새로운 알고리즘도 개발해 왔음. 라이브러리의 현재 상태에 만족하고 다음 10년을 기대하며, 사용·이슈 보고·패치 기여·개발 지원에 감사를 전함.
  • 이번 릴리스의 핵심 라이브러리 작업 대부분은 Valve의 후원을 받음.

복셀 리메싱

  • 실험적 복셀 리메셔 meshopt_remesh는 입력 메시를 지정된 해상도로 복셀화하고, 각 복셀에 메시 표면의 근삿값을 저장한 뒤 그리드에서 새 메시를 생성함. 원래 메시의 위상과 정확한 정점 위치는 보존하지 않음.
  • 결과물은 균일한 테셀레이션을 갖는 닫힌 메시이며, 그대로 사용하거나 추가 단순화의 기반으로 사용할 수 있음. 복셀 하나보다 가까운 특징은 합쳐지고, 복셀 하나보다 작은 틈은 닫힐 수 있으며, 기본 설정에서는 메시 내부가 채워짐.
  • 외관을 개선하려면 meshopt_RemeshSolve 옵션으로 정점 위치를 최적화해 원본 메시의 특징에 맞출 수 있음.
  • 전통적인 거리장 기반 방식과 달리 어떤 복셀 해상도에서도 얇은 시트를 보존하지만, 가는 선 형태의 지오메트리는 사라질 수 있음.
  • 아직 실험 단계라 향후 릴리스에서 개선될 수 있음. 특히 얇은 특징은 자기 교차를 일으킬 수 있어 올바른 렌더링에 백페이스 컬링이 필요할 수 있음.
  • 가능한 활용 사례 중 하나는 원본 메시·재질·텍스처를 하나로 합친 저폴리 텍스처 프록시 생성임. 리메시→단순화→언랩→재텍스처링 파이프라인을 구현한 온라인 데모가 다른 옵션과 함께 예제로 제공됨.

노멀 생성과 메시 단순화

  • 리메싱은 입력 속성을 모두 버리므로 조명에 필요한 출력 노멀을 새로 생성해야 함. 이를 위한 meshopt_generateNormals는 크리즈 각도 기준의 자동 스무딩 그룹 감지와 인접 삼각형 간 노멀을 부드럽게 하는 선택적 후처리를 제공함.
  • 이 기능은 리메시된 메시에서 특히 유용하지만, meshopt_generateTangents와 마찬가지로 모든 메시에서 사용할 수 있는 범용 알고리즘임.
  • 기존 단순화 함수의 동작을 자동으로 개선하고 추가 제어 옵션을 제공하는 여러 개선이 포함됨.
  • meshopt_SimplifyPermissive 모드는 버그 수정과 지오메트리 경계 주변 단순화의 상당한 개선을 거쳐 안정화됨. 이는 퍼미시브 모드를 안정화하는 데 필요한 마지막 개선이며, 더 이상의 호환성 파괴 변경은 예상되지 않음.
  • 리메시 메시에서 나타날 수 있는 양면 지오메트리의 단순화를 개선하려면 meshopt_SimplifyPreserveFolds 옵션을 활성화할 수 있음. 이 옵션은 날카로운 크리즈나 양면 시트의 가장자리가 깎여 나가는 현상을 줄임.
  • 속성 인식 단순화에서 속성 분산이 큰 입력 지오메트리의 축약 순서와 반환 오류를 개선하려면 meshopt_SimplifyErrorClamped 옵션을 활성화할 수 있음. 이 옵션은 세부 단계(LOD) 선택을 덜 보수적으로 바꾸며, 속성 인식 단순화 사용 전반에 권장됨.
  • clusterlod.h에는 식생 단순화를 눈에 띄게 개선할 수 있는 simplify_dilate_borders 옵션이 추가됨. 다른 단순화 개선도 clusterlod.h에 적용됐으며, 오류 제한은 기본 활성화 상태임.

라이브러리 개선

  • 실험적 복셀 리메셔 meshopt_remesh: 기존 메시를 원본으로 사용하되 위상과 정확한 정점 위치를 무시하고, 지정된 복셀 해상도에서 새 메시 생성
  • 실험적 노멀 생성 함수 meshopt_generateNormals: 크리즈 각도 기준 자동 스무딩 그룹 감지와 선택적 스무딩 후처리를 통한 노멀 생성
  • 실험적 단순화 플래그 meshopt_SimplifyPreserveFolds: 양면 지오메트리의 경계가 깎이는 현상 감소
  • 실험적 단순화 플래그 meshopt_SimplifyErrorClamped: 속성 분산이 큰 영역에서 과도하게 보고되는 속성 오류 조정
  • meshopt_simplify*의 meshopt_SimplifyPermissive 모드 안정화
  • meshopt_opacityMap* 함수, meshopt_generateTangents, meshopt_filterIndexBuffer*, meshopt_computePositionExponent 안정화
  • 퍼미시브 단순화에서 지오메트리 경계 처리와 축약 점수 산정 개선
  • meshopt_encodeVertexBufferBound가 반환하는 과도하게 보수적인 최악 경계 축소
  • Clang/GCC 사용 시 meshopt_decodeIndexBuffer 성능 약 15% 개선
  • 대형 메시에서 meshopt_buildMeshletsSpatial 성능 약 15% 개선
  • meshopt_partitionClusters 성능 약 10% 개선
  • 4의 배수가 아닌 스트라이드에 대한 meshopt_generateVertexRemap 지원 개선
  • bits=24일 때 meshopt_encodeFilterExp의 반올림 오류 수정

추가 개선

  • clusterlod.h에 경계 확장 기능 추가: clodConfig::simplify_dilate_borders를 통한 식생 단순화 개선
  • 속성을 사용하는 경우 clusterlod.h의 클러스터 오류 추정 개선 및 LOD 선택의 보수성 완화
  • clusterlod.h의 메모리 할당 횟수 대폭 감소
  • 단순화 중 clusterlod.h가 빈 클러스터를 생성하는 경우 수정
  • -sv 인수로 요청할 때 gltfpack에서 위치·속성 갱신을 포함한 단순화 구현
  • -gn 인수로 요청할 때 gltfpack에서 노멀 생성 구현
  • 양자화를 사용하지 않을 때 gltfpack의 정점 재인덱싱 개선 및 출력 메시 압축도 향상
  • 텍스처 변환 확장을 사용한 재질에서 gltfpack의 UV 양자화 수정
  • 양자화된 UV 범위가 다르지만 지오메트리가 동일한 메시에서 gltfpack의 메시 중복 제거 수정
  • Apple과 GitHub가 macOS/Intel 지원을 중단하는 데 대비해 공식 macOS용 gltfpack 바이너리 빌드는 이제 AArch64 전용임. Intel Mac용 gltfpack은 계속 수동 빌드 가능함