3D Model Formatları · glTF / GLB · Uzantılar (Extensions)
KHR_draco_mesh_compression glTF'de Sıkıştırılmış
Geometri
«GLB küçüldü ama model yüklenmiyor» çoğu zaman texture değil Draco sözleşmesidir: uzantı ilan edilmiş, decoder yok; veya primitive'te blob var ama attribute eşlemesi kopuk. Extension Sistemi mekanizmayı anlatır; bu sayfa Uzantılar grubunun ilk derin sorusuna geçer: sıkıştırılmış mesh dosyada nasıl yazılır?
Draco, geometri özniteliklerini (POSITION, NORMAL, TEXCOORD, indices, JOINTS, WEIGHTS…)
tek bir sıkıştırılmış binary blob olarak taşır. Core glTF okuyucusu ham
bufferView → accessor zincirini bekler; Draco'lu primitive'te «gerçek vertex verisi»
extension bufferView içindedir ve loader decode sonrası GPU'ya açar.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz:
«KHR_draco_mesh_compression primitive
extensions altında bufferView + attribute eşlemesi
taşır. Accessor'lar meta veri (tip, count) sağlar; ham byte çoğu zaman yalnızca
Draco dilimindedir. Used/Required ilanı decoder zorunluluğunu belirler. Draco
geometriyi küçültür; texture, animasyon ve morph ayrı kalemlerdir.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa Draco uzantısının glTF dosya sözleşmesini anlatır:
extensionsUsed/extensionsRequired(Draco özel)primitives[].extensions.KHR_draco_mesh_compressionbufferViewblob +attributeseşlemesi- indices, morph/skin etkileşimi (format katmanı)
- Holodepth teşhis ve trade-off açıları
Bilinçli olarak dışarıda bırakılan konular:
- Genel extension mekanizması → Extension Sistemi
- Core bufferView / accessor zinciri → BufferView Sistemleri, Accessor Mantığı
- Vertex semantiği → Vertex Verileri
- Draco algoritması, quantization, entropy → Mesh Compression (Three.js)
- Encode/decode pipeline, WebWorker, parametre tuning → Three.js Draco dalı
- Texture sıkıştırma → KHR_texture_basisu
Kısa ayrım: Draco (Format) «blob + eşleme nasıl yazılır?» · Mesh Compression (Runtime) «decode nasıl yapılır, ne kadar sürer?» · Extension Sistemi «Used/Required genel kuralı»
Uzantılar grubu birinci soru
| Uzantı | Ne sıkıştırır / ekler | Soru | Sayfa |
|---|---|---|---|
| Draco | Mesh attributes + indices | Geometri binary'si nasıl küçülür? | KHR_draco_mesh_compression (bu sayfa) |
| BasisU / KTX2 | Texture görselleri | Doku baytı nasıl küçülür? | KHR_texture_basisu |
| GPU Instancing | Çoğaltma attribute'ları | Aynı mesh N kez nasıl çizilir? | EXT_mesh_gpu_instancing (planlanan) |
| Materials Variants | Materyal varyant seçimi | Hangi PBR kartı aktif? | KHR_materials_variants |
Draco uzantısı nedir? (Format dilinde)
Zihin modeli: zip'li kitap + içindekiler tablosu
- Core accessor sayfa sayfa düz metin (ham float dizisi).
- Draco bufferView sıkıştırılmış arşiv dosyası.
- Extension attributes map «POSITION hangi bölümde?» içindekiler.
- Loader arşivi açar; GPU düz metni okur (decode runtime).
Google Draco, mesh geometrisini kayıplı veya kayıpsıza yakın sıkıştırır; glTF bunu
KHR_draco_mesh_compression adıyla primitive seviyesinde ilan eder.
Dosyada «Draco açık» demek: en az bir primitive'in attribute verisi Draco blob'unda
saklanır ve standart accessor byte'ları ya yoktur ya anlamsızdır.
Bu sayfa şunların hiçbiri değildir:
- PNG/JPEG sıkıştırma değil texture BasisU sayfasında
- Animasyon keyframe sıkıştırma değil Draco geometri odaklıdır
- glTFzip / harici arşiv değil blob GLB içinde bufferView'dir
- DRACOLoader kurulum rehberi değil Three.js Draco dalında
Extension Sistemi «uzantı nasıl ilan edilir» der. Draco sayfası «bu uzantının primitive gövdesi ne taşır» der. Mesh Compression sayfası «decode ne kadar sürer» der. Üçü birlikte üretim kararını tamamlar.
Used vs Required: decoder sözleşmesi
Kök JSON'da uzantı adı listelenir ( Extension · Used/Required):
"extensionsUsed": ["KHR_draco_mesh_compression"],
"extensionsRequired": ["KHR_draco_mesh_compression"]
| Liste | Anlam | Loader davranışı (beklenen) |
|---|---|---|
| Yalnız Used | Draco var; core fallback mümkün olabilir | Decoder yoksa bazı araçlar reddeder, bazıları dener |
| Required | Decoder olmadan dosya anlamsız | Reddetmeli; sessiz boş mesh kabul edilemez |
| Used yok, gövde var | Bozuk / gizli uzantı | Çoğu loader yok sayar |
Holodepth üretim kuralı: Draco kullanıyorsanız Required yazın; «sessizce düz mesh'e düş» beklentisi ürün güvenilirliğini düşürür. Viewer / AR quick look gibi ortamlarda decoder yokluğu «model görünmüyor» olarak geri döner; bu format hatası değil, ortam kısıtıdır ama Required ile erken ve net reddedilir.
Primitive gövdesi: extension nesnesi
Draco verisi meshes[].primitives[].extensions altındadır; materyal
uzantıları gibi materials[] seviyesinde değildir. Tipik gövde:
"primitives": [{
"attributes": {
"POSITION": 0,
"NORMAL": 1,
"TEXCOORD_0": 2
},
"indices": 3,
"material": 0,
"extensions": {
"KHR_draco_mesh_compression": {
"bufferView": 7,
"attributes": {
"POSITION": 0,
"NORMAL": 1,
"TEXCOORD_0": 2
}
}
}
}]
Dikkat: hem üstteki attributes hem extension içindeki
attributes vardır. İkisi de semantic → accessor indeksi eşlemesi yapar;
extension içindeki map Draco decoder'a «hangi accessor meta'sı hangi Draco attribute
id'sine karşılık gelir» der. Uyumsuzluk decode hatası veya yanlış layout üretir.
Primitive bazında seçim
Aynı mesh içinde bir primitive Draco, diğeri ham olabilir. Holodepth envanter: primitive başına «Draco var mı?» bayrağı. «Tüm GLB Draco'lu» varsayımı yanlıştır; LOD0 sıkıştırılmış, LOD1 ham gibi hibrit paketler mümkündür.
bufferView: sıkıştırılmış
blob
Extension'daki bufferView indeksi, binary buffer'daki Draco bitstream
dilimine işaret eder. Bu dilim
BufferView kurallarına tabidir (byteOffset,
byteLength); fark şudur: byte'lar doğrudan float dizisi değil, Draco formatıdır.
- GLB: blob genelde BIN chunk içinde gömülüdür
- .gltf + .bin: aynı .bin dosyasında veya ayrı buffer
- Paylaşım: iki primitive aynı Draco bufferView'ı nadiren paylaşır; çoğu export primitive başına blob üretir
Dosya boyutu analizinde Draco dilimlerini ayrı toplayın: «GLB hâlâ büyük» teşhisinde texture payından sonra Draco payı, sonra animasyon payı gelir. Yalnızca toplam MB raporlamak hangi sıkıştırmanın işe yaradığını gizler.
Draco ≠ glTF dışı zip
HTTP gzip transport sıkıştırması ayrı katmandır. Draco, vertex semantics'i içeride yeniden kodlar. İkisi birlikte kullanılabilir; birinin varlığı diğerini gerektirmez.
Accessor'lar: meta veri, ham veri değil
Draco'lu primitive'te accessors[] hâlâ vardır. POSITION accessor'ı
type, componentType, count taşır; çoğu
export'ta bu accessor'ların bufferView alanı ya yoktur ya anlamsız
placeholder'dır. Gerçek köşe sayısı decode sonrası doğrulanır; meta
count ile uyumlu olmalıdır.
Holodepth okuma sırası:
- Primitive attributes → accessor indeksleri
- Extension attributes map → aynı indekslerin Draco tarafı
- Accessor meta (count, type)
- Extension bufferView → blob
Accessor katmanı genel kuralları Accessor Mantığı'ndadır; Draco istisnası: «byte nerede?» sorusunun cevabı çoğu zaman yalnızca extension bufferView'dadır.
indices accessor
indices de Draco içine gömülür; primitive üstünde indices accessor
indeksi kalır. Extension attributes map'te indices semantic'i yoktur;
indices ayrı accessor ile ilişkilidir. Export araçları indices'i Draco'ya dahil eder;
indices eksik primitive (non-indexed) Draco ile de mümkündür ama web'de nadir.
Decode sınırı: format saklar, runtime açar
glTF dosyasında decode edilmiş vertex buffer yoktur (Draco kullanıldığında). Format «sıkıştırılmış paket + meta» yazar; CPU decode loader'da ( Decode Process) veya native viewer'da gerçekleşir.
| Katman | Sorumluluk |
|---|---|
| glTF + Draco extension | Blob, attribute map, accessor meta |
| Draco decoder | Bitstream → interleaved/planar attributes |
| Loader / GPU upload | BufferAttribute, index buffer |
Holodepth trade-off: indirme MB düşer, ilk kare decode maliyeti artar. Bu format sayfasında «ne kadar sürer» rakamı verilmez; süre Three.js WebWorker performans konusudur. Format okuyucusu yalnızca «decode zorunlu mu?» sorusunu Required ile cevaplar.
Morph, skinning ve animasyon etkileşimi
Draco taban primitive attribute'larını sıkıştırır. Morph
targets[] delta'ları ayrı accessor setleridir (
Morph Targets). Birçok pipeline:
- Taban POSITION/NORMAL Draco içinde
- Morph delta'ları ham (veya sparse) accessor'da
- Animasyon keyframe'leri Draco dışında
«Draco açtım morph kayboldu» çoğu zaman export'un morph delta'larını düşürmesi veya
Draco sonrası targets dizisini güncellememesidir. Holodepth doğrulama: compress
sonrası targets.length ve weights animasyonu aynı mı?
JOINTS / WEIGHTS Draco içinde
Skinning attribute'ları da Draco blob'una dahil edilebilir ( Skinning). Decode sonrası JOINTS/WEIGHTS GPU'ya normal attribute gibi gider; IBM ve joint animasyonu Draco dışındadır. «Skinned ama deform yok» teşhisinde önce skin sözleşmesine, sonra Draco decode'a bakın; ikisini karıştırmayın.
Animasyon sıkıştırmaz
Yoğun keyframe binary'si Draco ile küçülmez. «Draco'lu GLB hâlâ ağır» vakalarının animasyon payını ayrı ölçün ( Keyframe · zaman alanı).
Sıkıştırılmış vs ham: dosya okuyucu farkı
| Özellik | Ham core | Draco extension |
|---|---|---|
| Vertex byte kaynağı | accessor.bufferView | extension.bufferView (Draco) |
| İlk okuma | Doğrudan memcpy | Decode gerekir |
| extensionsUsed | Gerekmez | Zorunlu pratik |
| Viewer uyumu | Geniş | Decoder bağımlı |
| Quantization | Accessor precision | Draco + export ayarı |
Karar ağacı ve parametre derinliği Three.js Draco karar noktası sayfasındadır. Format sayfası yalnızca «dosyada Draco var mı, nerede yazılı» sorusunu kapatır.
Holodepth perspektifleri çoğu dokümanda olmayan açılar
«Draco = küçük dosya» özeti üretimde yetersiz kalır. Aşağıdakiler sık görülür.
Görünmez model, küçük GLB
Required + decoder yok = bilinçli red. Used only + decoder yok = araç bağımlı sessiz başarısızlık. Holodepth: test ortamında decoder'sız yükleme senaryosunu bilinçli çalıştırın.
Attribute map uyumsuzluğu
Üst attributes ile extension attributes farklı accessor indeksleri gösterirse decode «başarılı» görünüp UV/NORMAL karışır. Envanter: iki map'i diff edin.
TANGENT / TEXCOORD kaybı
Agresif compress export'ta TANGENT düşer; normal map bozulur. Dosyada extension attributes listesinde TANGENT var mı kontrol edin ( Tangent Verileri).
Çift sıkıştırma beklentisi
Draco geometri + BasisU texture birlikte kullanılır; biri diğerinin yerine geçmez. Yalnızca Draco uygulayıp texture PNG bırakmak «hâlâ şişman» GLB üretir.
Düzenlenebilirlik kaybı
Draco'lu mesh'i DCC'de tekrar açmak decode + re-export gerektirir; ham accessor gibi «byte edit» yoktur. Pipeline'da source of truth'u Draco'suz master'ta tutun; Draco yalnızca dağıtım artefaktı olsun.
Altı soruluk Draco teşhisi
| Soru | Yeşil ise | Kırmızı ise bak |
|---|---|---|
| Used'da Draco var mı? | İlan tamam | Gizli gövde |
| Required uygun mu? | Decoder zorunluluğu net | Viewer sessiz fail |
| extension.bufferView geçerli mi? | Blob var | Boş / kopuk dilim |
| Attribute map uyumlu mu? | Semantic hizalı | UV/normal swap |
| Accessor count tutarlı mı? | Meta doğru | LOD / export hatası |
| Morph/skin/anim ayrı doğrulandı mı? | Tam paket | Compress sonrası kayıp |
Holodepth içgörüsü
Draco debug'unda önce decode süresine değil ilan + blob + map üçlüsüne bakın: Used/Required doğru mu, bufferView byteLength > 0 mı, üst/extension attribute map özdeş mi? Üçü yeşilse sorun decoder kurulumu veya GPU upload'tadır; biri kırmızıysa dosya sözleşmesi bozuktur.
Draco'dan sonra
Geometri sıkıştırması netleşince Uzantılar grubunda sıradaki dosya boyutu kalemi texture'dır:
- KHR_texture_basisu KTX2 / GPU texture sıkıştırma
- EXT_mesh_gpu_instancing çoğaltma
- KHR_materials_variants materyal varyantları
- Runtime Draco Mesh Compression
Format okuyucusu özeti: Draco = primitive extension + blob + attribute map + accessor meta. Decode runtime işidir; Required decoder'ı zorunlu kılar. Geometri küçülür; texture ve animasyon ayrı optimize edilir.