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

50MB PBR 모델을 Blender 내보내기, 정점 압축, KTX2 텍스처 변환, 엔진 로딩 전체 과정을 거쳐 최종 5MB 이하로 압축합니다. 완전 자동화 스크립트와 시리즈 요약 표 포함.

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)을 사용하지만, 진입 장벽이 없고 터미널을 만질 필요가 없습니다.

자주 발생하는 문제와 해결 방법

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

  • 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 필드를 사용하여 대체 텍스처를 제공하세요.

시리즈 치트 시트

6개 글의 핵심을 표 한 장으로 압축했습니다. 즐겨찾기에 추가해 두세요.

구성 비중

구성 요소비중최적화 도구
텍스처70-85%KTX2 (가장 큰 효과)
정점 데이터10-20%MeshOpt / 양자화 / Draco
애니메이션0-15%키프레임 축소 / 압축
기타< 2%중복 제거

VRAM 계산 공식

기존 포맷 VRAM = 가로 * 세로 * 4바이트 * 1.333 (밉맵 포함)
KTX2 블록 압축 VRAM ≈ 위 값 / 4 (ETC1S) 또는 / 2 (UASTC)

정점 압축 선택

상황권장
의존성 없이 가장 단순하게순수 양자화 (KHR_mesh_quantization)
웹에서 균형 잡힌 첫 선택MeshOpt
극한의 압축률, 디코딩 지연 감수Draco
미니 프로그램 / 패키지 용량 민감순수 양자화 / MeshOpt, Draco 회피

텍스처 압축 선택

텍스처 종류권장 코덱
albedo / emissive (색상)KTX2 ETC1S
normal / roughness / metallic / AO (데이터)KTX2 UASTC
데스크톱 웹, 다운로드 속도 우선WebP / AVIF
작은 텍스처 (< 128px)PNG 유지, KTX2 회피

원클릭 명령

# 전체 최적화 (텍스처 + 정점 + 단순화)
gltf-transform optimize model.glb model-final.glb \
  --texture-compress basisu --meshopt \
  --simplify --simplify-ratio 0.5 --weld --prune

플랫폼별 빠른 참조

플랫폼텍스처정점
데스크톱 웹WebP / KTX2MeshOpt
모바일 웹KTX2 필수MeshOpt
VRKTX2 필수MeshOpt + LOD
미니 프로그램KTX2 / WebPMeshOpt / 양자화
대규모 씬KTX2 필수MeshOpt + Draco + LOD

시리즈 되돌아보기

6개 글이 하나의 완성된 흐름을 이룹니다:

  1. 3D 모델은 왜 이렇게 클까?: 용량 구성과 VRAM의 실제를 이해
  2. 정점 압축의 세 가지 기술: 양자화, MeshOpt, Draco의 원리와 선택
  3. 텍스처 VRAM 문제: PNG/JPG가 GPU에서 비효율적인 이유
  4. KTX2 실전: ETC1S/UASTC 선택, 도구 체인, 엔진 로딩
  5. 압축 방식 선택 가이드: 플랫폼과 상황별 의사결정 프레임워크
  6. 이 글: Blender에서 출시까지의 종단간 파이프라인

핵심은 한 문장입니다: 병목(다운로드, VRAM, 프레임 레이트)을 먼저 파악한 뒤 도구를 고르세요. 텍스처 압축이 가장 큰 효과를 내고, 정점 압축은 마무리 역할이며, 플랫폼마다 조건이 다르니 하나의 공식을 모든 곳에 적용하지 마세요.

이 글의 스크립트와 치트 시트를 그대로 따라 하면 50MB에서 5MB로, VRAM 520MB에서 70MB로 줄이는 과정이 재현 가능한 경로가 됩니다. 이제 남은 건 실행뿐입니다.

관련 도구

6
전체 보기
3D 모델 압축
3D 모델을 이미지로 변환
3D 모델 뷰어
3D 모델 정점 압축
STL를 이미지로
GLB 뷰어