4.1 GLB란 무엇인가

3D 모델·텍스처·애니메이션을 하나의 바이너리 파일로 묶은 웹 최적화 포맷. 3D Tiles 1.1이 tile content로 직접 채택한 이유와 전체 아키텍처를 한눈에. 업데이트: 2026-05-14


핵심 요약

구분내용
📖 정의glTF 2.0의 단일 바이너리 컨테이너 포맷. JSON·바이너리·텍스처를 하나의 .glb 파일에 묶는다.
💡 핵심”3D계의 JPEG” — 실시간 렌더링·웹·AR/VR 환경에 최적화된 Khronos 오픈 표준. 3D Tiles 1.1의 tile content가 곧 GLB.
🎯 대상Three.js · Babylon.js · CesiumJS 웹 3D, Unity/Unreal 게임 엔진, AR/VR 앱, 3D Tiles 1.1 파이프라인 개발자
⚠️ 주의sampler minFilter 미설정 시 Mipmap이 무시되어 텍스처 aliasing이 발생한다 → Sampler 보정 가이드

목차

  1. glTF/GLB가 해결하는 문제
  2. 버전 히스토리
  3. glTF vs GLB 두 포맷의 분기
  4. 전체 아키텍처 구성 요소
  5. 씬 그래프 계층 — Mermaid
  6. 좌표계 규약
  7. 포맷 비교 (GLB vs FBX·OBJ·COLLADA)
  8. 지원 플랫폼 현황
  9. 주요 특징과 한계

glTF/GLB가 해결하는 문제

기존 3D 포맷(OBJ, FBX, Collada, STL)은 두 가지 문제를 안고 있었다.

문제기존 포맷glTF 2.0의 해결
다중 파일 의존성OBJ: .obj + .mtl + 텍스처 분리 → 전송 복잡단일 GLB 파일로 패키징
독점 포맷FBX: Autodesk 독점, 오픈 스펙 없음Khronos 오픈 표준, ISO/IEC 12113:2022
웹 비최적화COLLADA(DAE): XML 기반 파일 크기 과대바이너리 + JSON 메타데이터로 ~30% 감소
PBR 미지원레거시 포맷이 물리 기반 재질 표현 못 함PBR Metallic-Roughness 표준화 — 엔진 간 결과 일치
런타임 로딩 비효율텍스트 파싱·재구성 비용 큼accessor 메타데이터 + raw 바이너리 → GPU 직접 업로드
확장성 부족신규 기능 추가 시 포맷 깨짐extensions 메커니즘 (KHR_/EXT_/벤더_)

이 설계 철학은 “3D계의 JPEG” 라는 표어로 압축된다 — 디자인 원본(PSD)이 아닌 배포·전송·런타임 표시용 포맷.

참고: 3D Tiles 1.1이 자체 컨테이너(b3dm/i3dm/pnts)를 폐기하고 GLB를 직접 채택한 이유도 같다 — 표준 도구(validator, gltf-transform, Three.js, Blender)를 그대로 쓸 수 있기 때문이다. → 상세


버전 히스토리

날짜버전주요 내용
2015-10glTF 1.0최초 공식 버전
2017-06glTF 2.0PBR(물리 기반 렌더링) 재질 도입. 현재 GLB의 기반
2022-08ISO/IEC 12113:2022국제 표준으로 채택
2022-123D Tiles 1.1 (OGC)GLB를 tile content로 직접 채택
2025–2026확장 추가KHR_gaussian_splats, KHR_materials_volume 등 신규 확장 지속

glTF vs GLB 두 포맷의 분기

같은 데이터 모델을 갖지만 패키징이 다르다.

항목.gltf (텍스트).glb (바이너리)
파일 구성JSON 1개 + .bin 1개 이상 + 텍스처 파일들단일 파일
JSONUTF-8 텍스트, 사람이 읽고 git diff 가능GLB의 JSON 청크에 내장
미디어 타입model/gltf+jsonmodel/gltf-binary
외부 참조URI(상대/절대/data URI)로 .bin·이미지 참조모두 BIN 청크에 임베드
파일 크기약간 크다 (base64 사용 시 ~33% 증가)30% 더 작다 (base64 회피)
편집·디버깅쉬움 (JSON 직접 수정 가능)어려움 (전용 도구 필요)
다운로드HTTP 요청 다수 (병렬)HTTP 요청 1개
사용 시기개발/디버깅, 에셋 파이프라인배포, 3D Tiles tile content, CDN 스트리밍
[glTF 구조]                    [GLB 구조]
model.gltf (JSON)              model.glb
model.bin  (바이너리) ──→      ┌────────────────┐
texture1.png                   │ Header (12B)   │
texture2.jpg                   │ JSON Chunk     │
                                │ Binary Chunk   │
                                └────────────────┘

결론: 작업 중에는 .gltf로 두고 디버깅하다가, 3D Tileset에 넣을 때는 .glb로 패키징하는 패턴이 표준이다.


전체 아키텍처 구성 요소

구성역할비고
assetglTF 버전·생성기 메타데이터모든 파일의 첫 키
scene + nodes씬 그래프 (DAG 아니고 트리)카메라·라이트·메시 컨테이너
meshes + primitives렌더링 대상 지오메트리primitive = 1 draw call
accessors + bufferViews + buffers데이터 3계층 — 의미·구간·바이트 분리GPU 업로드 직결
materials + textures + images + samplersPBR 머티리얼 + 텍스처 4단 분리sampler 재사용 효율
skins + animations본 애니메이션·키프레임캐릭터
cameras투영 정의노드에 부착해서 사용
extensionsKHR_/EXT_/벤더 확장3D Tiles 1.1의 핵심 메커니즘

각 구성은 JSON 최상위의 배열로 저장되고, 상호 참조는 항상 정수 인덱스로 한다. ID 문자열 검색이 필요 없어 O(1) 조회가 가능하다. 자세한 객체별 정의는 4.2 GLB 구조와 용어 참조.


씬 그래프 계층 — Mermaid

graph TD
    A["glTF Root<br/>(asset · scene · scenes · ...)"]
    A --> B["scenes[ ]<br/>씬 정의 배열"]
    B --> C["scene = 0<br/>기본 씬 인덱스"]
    C --> D["nodes[ ] — 노드 배열"]
    D --> E["node<br/>transform + children"]
    E --> F["children → 다른 node 인덱스"]
    E --> G["mesh = m<br/>(선택)"]
    E --> H["camera = c<br/>(선택)"]
    E --> I["skin = s<br/>(선택)"]
    G --> J["meshes[m]<br/>= primitives[ ]"]
    J --> K["primitive<br/>(1 draw call)"]
    K --> L["attributes<br/>POSITION·NORMAL·UV…"]
    K --> M["indices<br/>(accessor 인덱스)"]
    K --> N["material<br/>(material 인덱스)"]
    L --> O["accessor[ ]"]
    M --> O
    O --> P["bufferView[ ]"]
    P --> Q["buffer[ ]<br/>(raw bytes / BIN chunk)"]
    N --> R["materials[ ]<br/>PBR 정의"]
    R --> S["TextureInfo → textures[ ]"]
    S --> T["images[ ]<br/>+ samplers[ ]"]

핵심: 위에서 아래로 참조 인덱스의 연쇄다. 위쪽은 “무엇을 그릴지”, 아래쪽은 “실제 바이트가 어디 있는지”를 담는다.


좌표계 규약

항목glTF 규약
손잡이오른손 (Right-handed)
+Y up
−Z forward
단위미터 (meter) 권장

⚠️ 3D Tiles와의 좌표계 차이: glTF는 Y-up, 3D Tiles는 Z-up · ECEF다. 3D Tiles 클라이언트(CesiumJS)는 자동으로 Y-up → Z-up 변환을 적용하므로, Blender에서 GLB를 export할 때는 반드시 Y-up으로 한다. 직접 변환한 데이터를 넣으면 모델이 90도 누워서 렌더된다. → 상세


포맷 비교 (GLB vs FBX·OBJ·COLLADA)

구분GLBFBXOBJCOLLADA
표준화Khronos (ISO 오픈)Autodesk (독점)사실상 공개Khronos (오픈)
PBR 재질완벽 지원독자 방식미지원기본 재질
파일 크기최소 (Draco 가능)중간매우 큼 (XML)
웹 최적화최적미흡미흡미흡
애니메이션지원완전 지원미지원지원
주 용도웹·AR/VR 런타임·3D TilesDCC ↔ 게임 엔진단순 교환레거시 교환

지원 플랫폼 현황

플랫폼 / 도구GLB 지원비고
Three.jsGLTFLoader
Babylon.js@babylonjs/loaders/glTF
CesiumJSModel.fromGltfAsync() · 3D Tiles 1.1 tile content
Unity✅ 플러그인GLTFast, UnityGLTF
Unreal Engine✅ 플러그인내장 glTF 임포터
Blender내장 Import/Export
iOS (SceneKit/RealityKit)USDZ 변환 권장
Android (ARCore)Filament 렌더러
웹 브라우저 (model-viewer)Google <model-viewer> 태그

주요 특징과 한계

특징 (강점)

특징설명
GPU 친화accessor 메타데이터를 그대로 typed array로 매핑 — 파싱 후 변환 불필요
표준 PBRMetallic-Roughness 워크플로우로 엔진 간 결과 일치
확장 시스템KHR_/EXT_로 신규 기능 추가 시 후방 호환 (extensionsRequired로 거부 가능)
단일 파일 옵션GLB로 패키징 → 한 번의 HTTP 요청
검증 도구 표준화glTF-Validator로 스펙 준수 자동 확인
3D Tiles 1.1 직접 호환tile content가 곧 GLB

한계

한계설명
편집 우선 아님원본 작업 파일이 아닌 배포 포맷. 디자인 의도 일부 손실 가능
float32 정밀도지구 규모 좌표는 정밀도 부족 → CESIUM_RTC 또는 tile.transform으로 보완 (상세)
BLEND 머티리얼 비용알파 블렌딩은 정렬·성능 비용 큼. MASK 모드 우선 권장
확장 미지원 시 거부extensionsRequired에 없는 확장을 로더가 모르면 거부 — Three.js·Cesium 지원 매트릭스 확인 필수
단일 자료원 강제외부 .bin은 가능하지만 GLB는 BIN 청크 1개만 — 큰 자산은 분할 로직 별도 필요
sampler 미설정 함정minFilter 미설정 시 Mipmap 무시 → aliasing (보정 방법)

문서 탐색


참고 자료