holodepth

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_compression
  • bufferView blob + attributes eş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:

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"]
Draco ilan matrisi
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ı:

  1. Primitive attributes → accessor indeksleri
  2. Extension attributes map → aynı indekslerin Draco tarafı
  3. Accessor meta (count, type)
  4. 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 ayrımı
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ı

Ham vs Draco primitive
Ö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

Draco katmanı kontrol listesi
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:

  1. KHR_texture_basisu KTX2 / GPU texture sıkıştırma
  2. EXT_mesh_gpu_instancing çoğaltma
  3. KHR_materials_variants materyal varyantları
  4. 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.