Kris

Blender에서 출시까지: 종단간 압축 실전 가이드

3D 압축파이프라인텍스처 압축정점 압축glTF

시리즈가 여기까지 왔습니다. 도구, 원리, 선택 기준을 모두 다뤘습니다. 마지막 이 글에서는 모든 것을 하나의 실행 가능한 파이프라인으로 연결합니다: 실제 Blender 모델에서 시작하여 단계별로 압축하고, 각 단계마다 파일 크기, VRAM, 로딩 시간 변화를 기록합니다. 최종적으로 50MB의 '뚱뚱이'가 모바일에서 즉시 열리는 5MB 모델로 변신하는지 확인합니다.

대상 독자: 앞선 5편을 읽고 실제로 적용할 준비가 된 분들. 이 글에서는 새로운 개념을 소개하지 않습니다. 복사해서 바로 쓸 수 있는 프로세스, 명령어, 스크립트만 제공합니다.

시작점: 실제 PBR 모델

매우 일반적인 이커머스 전시 모델을 샘플로 사용합니다: 완전한 PBR 텍스처를 가진 고정밀 제품 모델.

초기 지표
Blender 소스 파일~120MB (내보내지 않은 하이폴리 포함)
GLB 내보내기 (float32 + PNG)~50MB
정점 수약 18만
텍스처6장 4096×4096 (albedo, normal, roughness, metallic, AO, emissive)
VRAM 사용량 (6장 모두 압축 해제)~520MB
목표파일 ≤ 5MB, VRAM 제어 가능, 모바일에서 즉시 열림

50MB 파일, 520MB VRAM — 이 모델을 모바일에서 바로 로드하면 분명히 크래시가 납니다. 단계별로 진행합시다.

0단계: Blender에서 올바르게 내보내기

압축의 첫 번째 관문은 내보내기입니다. 많은 사람이 이 단계에서 피를 봅니다.

Blender에서 glTF 내보내기의 핵심 설정:

  • 형식: glTF Binary (.glb) (단일 파일, 전송에 용이)
  • 지오메트리: Normals, Tangents 체크 (PBR 노멀 맵에 탄젠트 필요)
  • UV: 내보내기 확인 (기본 켜짐)
  • 텍스처: Automatic 또는 JPEG (이 단계의 텍스처 형식은 중요하지 않으며, 나중에 다시 압축할 것이지만 내보내기가 되어야 합니다)
  • 압축: 아직 Blender 내장 Mesh 압축을 체크하지 마십시오. 더 전문적인 도구를 사용할 것입니다.
  • 변환: +Y Up (glTF 표준)
  • 데이터: 필요한 것만 체크 (애니메이션, 카메라, 조명이 필요하지 않으면 내보내지 않아 크기 감소)

내보낸 후 model.glb: 50MB, 6장 PNG 텍스처, float32 정점. 이것이 기준입니다.

첫 번째 흔한 함정: Blender는 기본적으로 사용되지 않는 메시, 숨겨진 헬퍼 오브젝트를 함께 내보냅니다. 내보내기 전에 File > Clean Up > Purge Orphans를 실행하고 아웃라이너에서 내보낼 오브젝트만 선택하십시오.

종단간 파이프라인 전경

전체 파이프라인을 시각화합시다:

Blender 소스 파일
   │   .glb 내보내기 (float32 + PNG)            50MB
   ▼
[1] 중복 제거 + 중복 정점 용접 (gltf-transform)   ~45MB
   │
[2] 정점 압축: MeshOpt (gltfpack / gltf-transform) ~30MB
   │
[3] 텍스처 압축: PNG → KTX2 (ETC1S/UASTC)     ~6MB
   │
[4] (선택) 기하 단순화 LOD (simplify)         ~4-5MB
   ▼
최종 model-final.glb                          ~5MB
   │
엔진 로딩 (Three.js / Babylon.js) → 런타임 트랜스코딩 → 출시

각 단계의 숫자는 아래 표에서 실시간으로 추적됩니다.

도구 체인: 어떤 것을 선택할까?

압축 도구가 여러 개 있습니다. 먼저 비교해보겠습니다. 잘못 선택하지 않도록:

도구강점약점적합한 경우
gltf-transform올인원, 텍스처+정점 한 번에, API화, 스크립트 가능극한 압축률은 전용 도구에 미치지 못함추천 주력, 대부분의 시나리오
gltfpack정점 압축 전문, MeshOpt 네이티브 지원텍스처 압축 능력 약함정점이 많고 MeshOpt 세밀 제어를 원할 때
toktx텍스처 압축 가장 전문적, 매개변수 가장 풍부텍스처만 처리, 전체 모델 처리 불가단일 텍스처 미세 조정
gltf-pipeline오래됨, Draco 지원유지보수 부진, 기능 부족기존 Draco 사용 프로젝트
온라인 도구 (gltf.report)설치 불필요자동화, 대량 처리에 부적합실험, 일회성 작업

주요 추천: gltf-transform으로 전체 과정을 진행하고, 필요시 gltfpack으로 정점 보강, toktx로 단일 텍스처 조정. 아래 모든 단계는 gltf-transform을 기반으로 합니다.

1단계: 중복 제거 + 용접

모델에는 종종 중복 정점, 사용되지 않는 노드와 재질이 있습니다. 먼저 정리합니다.

gltf-transform optimize model.glb step1.glb --weld --prune
단계파일 크기VRAM변화
기준50MB~520MB
Step 1 중복 제거45MB~520MB-5MB (VRAM은 변하지 않음, 텍스처가 그대로이기 때문)

VRAM은 거의 변하지 않았습니다. 예상된 결과입니다 — 중복 제거는 주로 정점과 구조를 절약하며, 텍스처가 VRAM의 주요 부분입니다.

2단계: 정점 압축 MeshOpt

gltf-transform optimize step1.glb step2.glb --meshopt --weld --prune

--meshopt는 정점을 16비트로 양자화하고 MeshOpt 무손실 코딩을 적용하며, 자동으로 EXT_meshopt_compression 확장을 추가합니다.

단계파일 크기VRAM변화
Step 145MB~520MB
Step 2 + MeshOpt30MB~520MB-15MB (정점 부분)

VRAM은 여전히 약 520MB? 맞습니다 — 정점이 VRAM에서 차지하는 비중이 작기 때문입니다(10-20%). 정점을 줄여도 VRAM에 미치는 영향은 제한적입니다. 진정한 VRAM 거인은 텍스처이며, 다음 단계에서 해결합니다.

3단계: 텍스처 압축 PNG → KTX2

이 단계는 가성비 최고입니다.

gltf-transform optimize step2.glb step3.glb \
  --texture-compress basisu \
  --meshopt --weld --prune

--texture-compress basisu는 각 텍스처 유형을 자동으로 판단합니다: 색상 맵(albedo, emissive)은 ETC1S, 데이터 맵(normal, roughness, metallic, AO)은 UASTC를 사용합니다.

단계파일 크기VRAM변화
Step 230MB~520MB
Step 3 + KTX26MB~70MB-24MB 파일 / -450MB VRAM

이 단계가 전체 파이프라인의 전환점입니다:

  • 파일이 30MB에서 6MB로 감소
  • VRAM이 520MB에서 약 70MB로 감소 — 6장의 4096 텍스처가 '압축 해제된 원본 픽셀'에서 '블록 압축'으로 변경되어, 각 텍스처가 ~87MB에서 ~11-14MB로 감소

VRAM이 한 자릿수 낮아졌습니다. 이것이 모바일에서 실행 가능 여부를 결정하는 핵심입니다.

4단계: (선택) 기하 단순화

더 작게 만들고 싶고, 정점 정밀도를 낮춰도 되는 시나리오라면 기하 단순화를 추가할 수 있습니다.

gltf-transform optimize step3.glb final.glb \
  --texture-compress basisu \
  --meshopt \
  --simplify --simplify-ratio 0.5 \
  --weld --prune

--simplify-ratio 0.5는 정점의 약 50%를 유지한다는 의미입니다.

단계파일 크기VRAM변화
Step 36MB~70MB
Step 4 + 단순화 0.54.5MB~70MB-1.5MB (VRAM 거의 변화 없음)

단순화는 주로 파일 크기를 절약하며, VRAM에는 거의 영향을 미치지 않습니다. 대가는 모델 디테일 감소입니다 — 가까이서 보면 눈에 띕니다. 이커머스 제품 페이지는 일반적으로 과도한 단순화를 권장하지 않으며, 건축물/대형 장면에 적합합니다.

효과 추적 총괄표

네 단계를 모두 합쳐 전체를 보겠습니다 (위 샘플 기준, 숫자는 규모를 설명하기 위한 것입니다):

단계파일 크기VRAM누적 감소율
기준 (float32 + PNG)50MB~520MB
+ 중복 제거/용접45MB~520MB-10%
+ MeshOpt 정점30MB~520MB-40%
+ KTX2 텍스처6MB~70MB-88% 파일 / -87% VRAM
+ 기하 단순화(0.5)4.5MB~70MB-91% 파일

결론: 텍스처 압축이 대부분의 부피와 VRAM 이득을 제공합니다. 정점 압축은 보너스, 텍스처 압축은 생명줄입니다. 이는 1편의 주장과 완전히 일치합니다 — 텍스처가 80% 부피를 차지하며, 이를 최적화하는 것이 가장 높은 수익을 제공합니다.

한 줄 명령 버전: 게으른 사용자를 위한 원클릭 압축

단계별로 볼 필요 없이 모든 최적화를 한 번에 적용하려면:

gltf-transform optimize model.glb model-final.glb \
  --texture-compress basisu \
  --meshopt \
  --simplify --simplify-ratio 0.5 \
  --weld --prune

이 한 줄 명령 = 중복 제거 + 용접 + 정점 MeshOpt + 텍스처 KTX2 + 기하 단순화. 90%의 시나리오에서 충분합니다. 단계별로 나누는 것은 주로 이해와 매개변수 조정을 위한 것입니다.

환경 구축이 싫다면? Any3D 온라인 압축 사용

위의 gltf-transform 명령어와 스크립트는 로컬에서 Node를 설치하고, 도구 체인을 구성하고, 많은 매개변수를 기억해야 합니다. Any3D의 온라인 압축 도구는 이 모든 것을 생략합니다:

  • 스크립트 다운로드, 환경 설치 불필요 — 웹 페이지를 열기만 하면 됩니다
  • 모델이 서버에 업로드되지 않음 — 전체 프로세스가 브라우저 로컬에서 처리되며, 파일이 기기를 떠나지 않습니다
  • 시각적 구성 — 텍스처 KTX2, 정점 MeshOpt, 기하 단순화를 슬라이더로 조정하고 실시간 미리보기
  • 원클릭 여러 버전 — 모바일/데스크탑/VR 플랫폼에 맞게 압축 결과 내보내기

GLB를 선택하고, 대상 플랫폼을 고르고, 클릭 한 번으로 압축된 모델을 얻습니다. 내부는 위의 명령줄과 동일한 기술(gltf-transform)을 사용하지만, 진입 장벽이 없고 터미널을 만질 필요가 없습니다.

자주 발생하는 문제 FAQ

압축 후 모델이 검게 변하거나 텍스처가 표시되지 않음

  • 99%는 색상 공간 문제: 색상 맵에 sRGB가 누락되었습니다. Three.js에서 texture.colorSpace = THREE.SRGBColorSpace를 설정하세요.
  • toktx 사용 시 색상 맵에 --srgb를 추가하는 것을 잊었습니다.

노멀 맵 압축 후 조명이 잘못됨

  • 노멀 맵이 ETC1S로 압축되었습니다. UASTC로 변경하세요.
  • 노멀 맵이 DirectX 스타일(녹색 채널이 아래쪽)이고 엔진이 OpenGL 스타일을 필요로 하는 경우, G 채널을 뒤집어야 합니다.

모바일에서 첫 화면 로딩이 멈춤

  • Draco 디코더 wasm을 로딩하는지 확인하세요 (추가 요청). 모바일에서는 MeshOpt를 우선 사용하세요.
  • KTX2 트랜스코더 경로가 잘못 설정되어 트랜스코딩이 실패하고 CPU 압축 해제로 폴백됩니다.

압축 후 파일 크기가 오히려 커짐

  • 텍스처가 너무 작은 경우(< 128px) KTX2 압축이 비효율적이며, 블록 압축에 고정 오버헤드가 있습니다.
  • 모델이 이미 한 번 압축된 경우, 다시 압축해도 이득이 없거나 오히려 손해입니다.

단순화 후 모델 표면이 깨짐

  • --simplify-ratio가 너무 낮습니다. 0.7-0.8로 낮추세요.
  • 단순화는 하드 서피스(기계, 건축)에 적합하며, 유기적 표면(캐릭터)은 쉽게 깨집니다.

KTX2가 일부 브라우저에서 로딩 실패

  • 구형 Safari / 구형 WebView가 지원하지 않습니다. PNG/WebP 폴백을 준비하거나, KHR_texture_basisufallback 필드를 사용하여 대체 텍스처
후원하기