Blender에서 출시까지: 종단간 압축 실전 가이드
시리즈가 여기까지 왔습니다. 도구, 원리, 선택 기준을 모두 다뤘습니다. 마지막 이 글에서는 모든 것을 하나의 실행 가능한 파이프라인으로 연결합니다: 실제 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 1 | 45MB | ~520MB | — |
| Step 2 + MeshOpt | 30MB | ~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 2 | 30MB | ~520MB | — |
| Step 3 + KTX2 | 6MB | ~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 3 | 6MB | ~70MB | — |
| Step 4 + 단순화 0.5 | 4.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_basisu의fallback필드를 사용하여 대체 텍스처