3D Model Formatları · glTF / GLB · Web İçin Kullanım
GLB vs glTF: Web'de Konteyner ve Dağıtım Seçimi
«Model yüklendi ama dokular beyaz» çoğu zaman materyal formülü değil; yanlış paketleme ve kırık URI yoludur. Neden glTF format ailesini kilitledi; bu sayfa Web İçin Kullanım hattının ikinci sorusuna geçer: aynı sahneyi tek GLB mi, modüler .gltf paketi mi dağıtacağız?
Holodepth'te «GLB vs glTF» tartışması «hangi format daha iyi?» değildir; ikisi de glTF 2.0 veri modelinin farklı disk ve ağ paketlemesidir. Bu sayfa dağıtım mühendisliği katmanıdır: HTTP istek sayısı, önbellek stratejisi, göreli URI sözleşmesi, kısmi güncelleme ve CDN yerleşimi. JSON chunk byte düzeni veya accessor offset hesabı burada değil; JSON Yapısı ve Binary Bufferlar File Structure'da kalır.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «GLB ve .gltf aynı organizasyon belgesini taşır; fark paket sınırındadır. GLB tek istek ve taşıma kolaylığı verir; modüler .gltf paralel fetch ve parça parça cache imkânı verir. Görüntüler gömülü veya harici olabilir; hibrit paketler mümkündür. Boyut ve frame time sayısal olarak Dosya Boyutu ve Runtime Performans sayfalarında ölçülür; bu sayfa hangi konteynerin hangi ürün senaryosuna uyduğunu kilitler.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa glTF 2.0 dağıtım konteyneri seçimini anlatır:
- GLB (tek binary) vs modüler .gltf + harici kaynaklar
- HTTP / fetch / önbellek stratejisi (üst seviye)
- Göreli URI, klasör sözleşmesi, taşıma tuzakları
- Gömülü vs harici görüntü yerleşimi (dağıtım açısı)
- Debug, diff, CI ve sanatçı iş akışı
- Karar matrisi ve hibrit paketler
- Holodepth teşhis açıları
Bilinçli olarak dışarıda bırakılan konular:
- JSON organizasyon şeması, indeks tabloları → JSON Yapısı · GLB içinde JSON
- bufferView / accessor byte ofsetleri → BufferView Sistemi
- images / textures / sampler alanları → Texture References
- «Neden glTF ailesi?» stratejisi → Neden glTF
- Toplam byte, mesh/doku payları → Dosya Boyutu Analizi
- Parse süresi, decode, draw call → Runtime Performansı
- GLTFLoader callback API → glTF Pipeline (Three.js)
Kısa ayrım: GLB vs glTF (Dağıtım) «paket sınırı ve CDN nasıl?» · JSON Yapısı (Sözleşme) «organizasyon belgesi nedir?» · Texture References (Format) «URI/bufferView alanları nedir?» · Dosya Boyutu (Ölçüm) «kaç byte?»
Web İçin Kullanım hattı ikinci soru
| Katman | Odak | Soru | Sayfa |
|---|---|---|---|
| 1 · Strateji | Format seçimi | Web'de neden glTF ailesi? | Neden glTF |
| 2 · Konteyner | GLB / .gltf | Tek dosya mı modüler paket mi? | GLB vs glTF (bu sayfa) |
| 3 · Boyut | Byte bütçesi | Ne kadar veri indiriliyor? | Dosya Boyutu Analizi |
| 4 · Performans | Runtime maliyeti | Parse ve GPU yolu ne kadar? | Runtime Performansı |
Aynı spec, iki paket: format ile konteyner ayrımı
Zihin modeli: aynı kitap, ciltli veya bölümlü baskı
- glTF 2.0 veri modeli = kitabın içeriği (sahneler, mesh, PBR).
- .gltf dosyası = içindekiler + «ekler klasörü» (harici .bin, PNG).
- .glb dosyası = içindekiler tek ciltte (JSON chunk + BIN chunk).
- Loader çıktısı = okunan kitap; cilt tipi sahneyi değiştirmez.
Yeni başlayanlarda en sık kavram karışıklığı şudur: «.gltf uzantısı glTF formatı, .glb başka format» sanmak. Holodepth terminolojisinde glTF 2.0 spesifikasyonu her iki paketi de kapsar; uzantı yalnızca sunum biçimini seçer. Export aracı «glTF Binary (.glb)» veya «glTF Separate (.gltf + .bin + textures)» der; ikisi de validator'dan geçebilir.
Organizasyon belgesinin şeması
JSON Yapısı · GLB içinde JSON bölümünde sabitlenmiştir:
GLB içindeki JSON chunk ile diskteki model.gltf aynı alanları taşır.
Bu sayfa o şemayı tekrarlamaz; «paket seçimi sahne semantiğini değiştirir mi?»
sorusuna hayır der ve dağıtım sonuçlarına odaklanır.
İki paket de aynı
nodes,materials,animationsgrafiğini taşıyabilir. Fark, bu grafiğin ve binary yükünün tarayıcıya kaç HTTP cevabıyla ve hangi önbellek anahtarıyla ulaştığıdır.
GLB dağıtım modeli: tek istek, tek önbellek anahtarı
GLB, web vitrininde en sık görülen pakettir çünkü operasyonel olarak basittir: bir
URL, bir dosya, bir MIME tipi. CDN'e chair-v3.glb koyarsınız;
loader tek fetch ile JSON ve binary buffer'ı birlikte alır. Chunk
sınırları (JSON / BIN / isteğe bağlı ek chunk'lar) spesifikasyonda tanımlıdır;
byte-level okuma File Structure'dadır.
GLB'nin dağıtım avantajları (stratejik, sayısız):
- Taşıma bütünlüğü: .bin veya doku dosyası «yanlışlıkla unutulmaz» (gömülü görüntü profilinde)
- Göreli URI kırılganlığı yok: tek dosya başka dizine taşınsa iç referanslar chunk offset ile çözülür
- CMS / DAM entegrasyonu: tek asset kaydı, tek versiyon hash'i
- Üçüncü parti viewer: model-viewer, Sketchfab benzeri akışlar GLB bekler
GLB'nin dağıtım maliyetleri:
- Kısmi güncelleme yok: yalnızca albedo değişse bile tüm GLB yeniden yayınlanır (hash değişir)
- Paralel indirme yok: mesh ve ağır 4K doku aynı pakette sırayla parse edilir (gömülü profilde)
- İnsan okunabilir diff yok: CI'da JSON satır diff'i doğrudan yapılamaz
- Chunk padding: çok küçük ekler bile hizalama nedeniyle birkaç byte ekleyebilir (boyut detayı Dosya Boyutu'nda)
Gömülü görsellerle tam GLB
«Tam GLB» profilinde görseller bufferView ile BIN chunk içinde veya
ayrı chunk'ta taşınır; harici PNG isteği oluşmaz. E-ticaret vitrininde bu, «tek
dosya garantisi» sağlar. Dezavantaj: aynı doku birden çok GLB'de tekrarlanırsa CDN
deduplication çalışmaz; ortak doku kütüphanesi için modüler paket veya harici URI
düşünülür (
Texture References · URI vs bufferView).
Modüler .gltf: çoklu dosya ve klasör sözleşmesi
Modüler paket tipik olarak şunları içerir: model.gltf (JSON),
model.bin (geometri / animasyon binary), textures/*.png
veya *.ktx2. JSON'daki buffers[].uri ve
images[].uri bu dosyalara göreli yollarla işaret eder. Paket bir
klasör sözleşmesidir; yalnızca .gltf dosyasını kopyalamak yetmez.
product-chair/
model.gltf ← organizasyon (JSON)
model.bin ← buffer[0]
textures/
albedo.png
normal.png
orm.png
Modüler paketin dağıtım avantajları:
- Paralel fetch: HTTP/2 ile .bin ve dokular eşzamanlı iner
- Parça parça cache: mesh aynı kalırken yalnızca
albedo.pnggüncellenebilir - Paylaşılan doku: birden çok .gltf aynı
shared/brick.pngURI'sine gidebilir - İnceleme: JSON metin diff, sanatçıya anlaşılır PR
- Progressive enhancement: önce düşük çözünürlük doku, sonra swap (ürün kodu + CDN yolu)
Modüler paketin riskleri:
- Yol kırılması:
../textures/foo.pngdeploy dizini değişince 404 - Eksik dosya: ZIP'ten yalnızca .gltf çıkarılırsa beyaz model
- CORS: .bin veya doku farklı origin'de ise header gerekir
- İstek sayısı: HTTP/1.1'de çoklu round-trip (Runtime Performans'ta ölçüm)
Data URI tuzağı
Modüler .gltf içinde görselleri veya küçük .bin'i base64 data URI olarak gömmek teknik olarak geçerlidir; dağıtım açısından çoğu zaman kötü fikirdir. JSON şişer, gzip verimsizleşir, diff imkânsızlaşır, tarayıcı belleğinde çift kopya oluşabilir. Holodepth kuralı: data URI yalnızca prototip; üretimde harici dosya veya GLB bufferView.
HTTP, fetch ve bağlantı semantiği
Konteyner seçimi doğrudan ağ davranışını şekillendirir. GLB tek istekte TTFB sonrası tüm paket akar; modüler paket önce küçük JSON alır, ardından URI listesinden kaynakları çeker. Loader bu ikinci aşamayı otomatik yapar; bu sayfa loader API'sini değil, ürünün beklediği istek desenini anlatır.
| Paket | İlk istek | Takip istekleri | Not |
|---|---|---|---|
| Tam GLB (gömülü) | *.glb |
0 (görüntü dahil) | En basit waterfall |
| GLB (harici doku yok, sadece BIN) | *.glb |
0 | Yaygın geometri paketi |
| Modüler .gltf | *.gltf |
*.bin + N doku |
HTTP/2 ile paralel |
| Hibrit GLB + CDN doku | *.glb |
Harici images[].uri |
Nadir ama geçerli |
Holodepth perspektifi: «tek istek her zaman daha hızlı» yanlıştır. Küçük JSON + üç paralel doku, dev bir GLB'nin tamamının inmesini beklemekten mobilde daha hızlı ilk render verebilir (düşük LOD doku stratejisi). Kesin sayılar Runtime Performansı'nda ölçülür; burada desen seçilir.
MIME tipleri ve CORS
Sunucu model/gltf-binary (.glb) ve model/gltf+json
(.gltf) döndürmelidir; yanlış Content-Type bazı ortamlarda loader
uyarısı üretir. Modüler pakette .bin için
application/octet-stream veya application/gltf-buffer
yaygındır. Kaynaklar farklı CDN origin'inde ise CORS header'ları zorunludur; GLB
tek origin'de bu riski azaltır.
Önbellek, versiyonlama ve immutable asset
Web dağıtımında konteyner seçimi cache politikasını belirler. GLB genelde
içerik hash'i ile adlandırılır (chair-a8f2.glb) ve uzun süreli
cache alır; dosya değişince URL değişir. Modüler pakette mesh ve doku ayrı
cache anahtarına sahip olabilir: model.bin aylarca aynı kalır,
albedo-v2.png haftalık güncellenir.
- GLB + hash: basit invalidation, tek atomik versiyon
- Modüler + hash per file: ince invalidation, daha fazla URL yönetimi
- Query string cache busting (
?v=3): çalışır ama CDN config'e bağlı; hash dosya adı daha güvenilir
Service Worker kullanan PWA'larda GLB tek cache entry; modüler paket parça parça precache listesine girer. Yanlış precache «eski doku + yeni mesh» karışımı üretebilir; versiyon etiketini tüm paket dosyalarında senkron tutun.
CMS'te kısmi güncelleme senaryosu
Ürün konfigüratöründe yalnızca renk dokusu değişirken mesh sabitse modüler .gltf veya harici URI'li GLB mantıklıdır. Tüm varyantlar KHR_materials_variants ile tek GLB'de de kalabilir; o zaman cache tek hash'te kalır, runtime seçim yapılır. Konteyner seçimi ile variants uzantısı birlikte düşünülmelidir: «dosya mı çoğaltıyoruz, materyal eşlemesi mi?»
Görüntü yerleşimi: gömülü, harici, hibrit
Konteyner kararı görüntülerin nerede yaşayacağını bağımsız olarak belirler. Spesifikasyon dört pratik profil sunar; alan detayları Texture References'ta kalır.
| Profil | Görüntü konumu | Tipik kullanım |
|---|---|---|
| Tam GLB | bufferView (BIN içi) | Tek dosya e-ticaret, e-posta eki benzeri taşıma |
| Modüler .gltf | Harici PNG/JPEG/KTX2 | Sanatçı pipeline, paylaşılan doku kütüphanesi |
| GLB + harici URI | Mesh GLB'de, doku CDN'de | Büyük KTX2 shard'ları ayrı cache |
| .gltf + gömülü .bin | URI .bin, görseller harici | JSON diff + ağır binary ayrı |
BasisU / KTX2 dokuları büyük olduğunda harici URI + ayrı cache anahtarı sık tercih edilir ( KHR_texture_basisu). Draco sıkıştırılmış geometri GLB BIN chunk içinde kalırken dokular modüler bırakılabilir; hibrit paket «en iyi iki dünya» arayışının sonucudur, spec ihlali değildir.
Debug, diff, CI ve ekip iş akışı
Konteyner seçimi yalnızca runtime'ı değil geliştirme hattını da etkiler. Modüler .gltf, git diff'te anlamlı satır değişiklikleri gösterir: «material 2 baseColorTexture index değişti» gibi. GLB binary diff okunaksızdır; CI'da genelde «byte değişti mi?» hash karşılaştırması yapılır.
- Sanatçı teslimi: klasör ZIP (modüler) veya tek GLB (basit handoff)
- Validator: her iki paket tipinde çalışır; hata mesajı aynı JSON şemasına referans verir
- Golden screenshot test: paket tipinden bağımsız; görsel regresyon aynı
- Acil debug: .gltf metin editörde açılır; GLB için glTF Inspector / dönüştürücü gerekir
Holodepth önerisi: repo'da modüler .gltf, CDN'de hash'li GLB üretim profili. Export pipeline otomatik GLB üretir; kaynak modüler kalır. İki artefakt aynı validator'dan geçer; dağıtım atomik GLB, inceleme modüler JSON olur. «Yalnızca GLB commit» teknik borç biriktirir.
Sıkıştırma uzantısı ve paket tipi
Draco export çoğu araçta GLB çıktısı verir; modüler .gltf + Draco da mümkündür. Paket tipi Draco'nun çalışıp çalışmadığını belirlemez; extension flag'i belirler ( Draco Mesh Compression). Ancak operasyonel olarak Draco'lu asset'ler web'de neredeyse her zaman GLB olarak servis edilir.
Karar matrisi: ne zaman hangi paket?
| Senaryo | Önerilen paket | Gerekçe (kısa) |
|---|---|---|
| E-ticaret tek ürün modeli | Tam GLB | Tek URL, eksik dosya riski sıfır |
| Ortak doku kütüphanesi (çok model) | Modüler .gltf | Paylaşılan URI, cache dedup |
| Sık doku güncellemesi, sabit mesh | Modüler veya harici URI'li GLB | Kısmi cache invalidation |
| Git / code review odaklı ekip | Modüler kaynak → CI'da GLB | Okunabilir diff |
| model-viewer / embed snippet | GLB | Ekosistem varsayılanı |
| Çok büyük KTX2 dokular | Hibrit (GLB mesh + CDN KTX2) | Paralel indirme, ayrı cache |
| Variants ile çok SKU | Tek GLB + variants | Dosya çoğaltma yerine eşleme tablosu |
Matris kesin kural değil, başlangıç noktasıdır. Nihai seçim byte bütçesi ( Dosya Boyutu) ve ölçülen waterfall ( Runtime Performansı) ile doğrulanır.
«Her zaman GLB» ve «her zaman modüler» ikisi de yanlıştır. Holodepth üretim hattı çoğu ekipte hibrittir: modüler kaynak, GLB dağıtım, harici KTX2 istisna.
Holodepth perspektifleri: çoğu dokümanda olmayan açılar
«GLB tek dosyadır, .gltf çok dosyadır» özeti yeterli değildir. Aşağıdaki tuzaklar üretim ekiplerinde haftalarca debug yemekten kurtarır.
CDN path rewrite ve göreli URI
Modüler .gltf'te textures/albedo.png yolu, .gltf dosyasının URL'sine
göredir. CDN kökünü /assets/v2/chair/model.gltf yapıp dokuları
/textures/global/ altına taşırsanız JSON'daki URI'leri de güncellemeniz
gerekir. GLB bu sınıf hatayı azaltır; hibrit pakette harici URI mutlak CDN URL'si
olmalıdır.
Çift fetch: hem .gltf hem .glb
Bazı ekipler «fallback» diye hem modüler hem GLB yayınlar; uygulama yanlışlıkla ikisini de yükler. Tek paket politikası belirleyin; diğerini build artefaktı olarak saklayın, public CDN'de ikisini birden expose etmeyin.
ZIP handoff ve eksik alt klasör
Sanatçıdan gelen ZIP'te textures/ gizli dosya veya yanlış büyük/küçük
harf (Linux CDN vs Windows export) 404 üretir. GLB handoff bu sınıf sorunu
azaltır; modüler pakette ZIP manifest checklist'i (gltf + bin + tüm URI'ler) CI
kapısı olsun.
GLB sanılan ama harici URI'li dosya
Uzantısı .glb olsa bile JSON chunk içinde images[].uri harici URL
olabilir. Tek dosya sanılıp CDN politikasını buna göre kurmak «yarım GLB» tuzağıdır.
Validator ve glTF Inspector ile URI envanteri çıkarın.
Subresource Integrity (SRI)
Modüler pakette .bin ve dokulara SRI hash eklenebilir; GLB tek hash ile SRI uygulanır. Güvenlik odaklı sitelerde konteyner seçimi integrity modelini etkiler; çok parçalı paket daha fazla hash yönetimi ister.
Bölgesel CDN ve aynı GLB
Tek hash'li GLB tüm edge'lere replike edilir; modüler pakette yalnızca değişen doku bölgesel cache'te güncellenir. Global kampanya «yalnızca sticker doku değişti» senaryosunda modüler veya harici URI kazanır.
Sekiz soruluk paket teşhisi
| Soru | Yeşil ise | Kırmızı ise bak |
|---|---|---|
| Tüm URI'ler 200 dönüyor mu? | Modüler paket bütün | 404 path, CORS, yanlış göreli yol |
| GLB'de harici URI var mı? | Bilinçli hibrit | «Tam GLB» varsayımı yanlış |
| Cache hash dosya adında mı? | Güvenli invalidation | Query string CDN bug'ı |
| Repo diff okunabilir mi? | Modüler kaynak veya JSON extract | Yalnızca binary GLB commit |
| Paylaşılan doku tekrar ediyor mu? | Modüler / harici URI düşün | Her GLB'de aynı PNG |
| Variants tek dosyada mı? | SKU başına GLB kopyası yok | Gereksiz depolama |
| MIME / CORS header doğru mu? | Loader uyarısı yok | Sunucu config |
| Waterfall ölçüldü mü? | Paket seçimi veriye dayanıyor | «Hissettiğim» optimizasyon |
Holodepth içgörüsü
Beyaz model teşhisinde önce materyal formülüne değil Network sekmesindeki 404 URI'lere bakın. Modüler pakette sorun %80 yol; GLB'de sorun %80 «hibrit harici URI unutuldu» veya «validator uyarısı görmezden gelindi». İkisi de paket sözleşmesi ihlalidir, shader hatası değil.
Konteyner kilitlendi; sıradaki ölçüm soruları
GLB mi modüler .gltf mi sorusu yanıtlandı. Web İçin Kullanım hattının üçüncü ve dördüncü adımları sayısal analize iner:
- Byte bütçesi Dosya Boyutu Analizi: padding, gömülü vs harici doku, Draco/Basis kazancı
- Runtime maliyeti Runtime Performansı: parse, decode, GPU upload, waterfall süresi
Format sözleşmesi File Structure ve Materyal dallarında; stratejik «neden» Neden glTF sayfasında kalır. Loader sahne kurulumu glTF Pipeline (Three.js) ile tamamlanır.
Format okuyucusu özeti: GLB ve .gltf aynı glTF 2.0 belgesini farklı paketler. GLB tek istek ve bütünlük; modüler paralel fetch ve kısmi cache. Hibrit profiller geçerlidir; seçim ürün senaryosu, ölçüm ve ekip iş akışına göre yapılır.