holodepth

3D Model Formatları · glTF / GLB · Uzantılar (Extensions)

KHR_texture_basisu glTF'de KTX2 Doku Sözleşmesi

«Draco ile küçüldü ama GLB hâlâ şişman» çoğu zaman texture payındadır: geometri sıkıştı, PNG/JPEG gövde aynı kaldı. Core glTF görüntüyü image/png veya image/jpeg bekler; Draco geometriyi küçültür; bu sayfa ikinci soruya geçer: sıkıştırılmış doku dosyada nasıl yazılır?

KHR_texture_basisu, görüntü kaynağını KTX2 konteyneri içinde Basis Universal süper sıkıştırılmış veri olarak taşır. Core images[] + textures[] zinciri aynı kalır; fark
mimeType: "image/ktx2", binary blob ve uzantı ilanıdır. Transcode (GPU formatına çevirme) runtime işidir; dosya yalnızca KTX2 byte'larını saklar.

Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «BasisU uzantılı glTF'de image kaydı KTX2 blob'u taşır; texture hâlâ source ile image'e bağlanır. Used/Required transcoder zorunluluğunu belirler. PBR slot anlamı (baseColor, normal, ORM) değişmez; yalnızca görüntü encoding değişir. Draco geometri, BasisU doku; ikisi birlikte tam paket küçültür.»

Bu sayfanın sınırı · komşu konularla ayrım

Bu sayfa BasisU uzantısının glTF dosya sözleşmesini anlatır:

  • extensionsUsed / extensionsRequired (BasisU özel)
  • images[]: mimeType, bufferView / URI
  • textures[] + isteğe bağlı extension gövdesi
  • Core texture zinciri ile birleşim; Holodepth teşhis açıları

Bilinçli olarak dışarıda bırakılan konular:

Kısa ayrım: BasisU (Format) «KTX2 image dosyada nasıl?» · KTX2 (Runtime) «transcode ne kadar sürer, VRAM ne kazanır?» · Texture Referansları «texture → image → sampler zinciri»

Uzantılar grubu ikinci 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
BasisU / KTX2 Texture görselleri Doku baytı nasıl küçülür? KHR_texture_basisu (bu sayfa)
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

BasisU uzantısı nedir? (Format dilinde)

Zihin modeli: aynı raf, farklı kutu formatı

  • Texture kaydı raf etiketi: hangi görüntü, hangi sampler.
  • Image (core) kutu adresi: URI veya bufferView.
  • KTX2 kutusu sıkıştırılmış içerik; PNG değil, transcoder gerekir.
  • BasisU ilanı «bu kutu KTX2; standart PNG okuyucu yetmez».

PNG/JPEG core yolunda image byte'ları doğrudan decode edilir. BasisU yolunda byte'lar KTX2 dosya formatıdır; içinde Basis Universal süper sıkıştırma ve çoğu zaman mip zinciri vardır. glTF uzantısı bu yolu resmen ilan eder; aksi halde loader PNG sanıp KTX2 byte'larını çözemez.

Bu sayfa şunların hiçbiri değildir:

  • Draco geometri değil mesh compression ayrı uzantı
  • Materyal clearcoat/sheen değil materyal uzantıları Extension Sistemi'nde
  • Basis codec matematiği değil Three.js Basis Universal sayfasında
  • WebP/AVIF HTTP transport değil glTF image kaydı sözleşmesi

Texture Referansları «texture nereye bakar» der. BasisU «o görüntü KTX2 mi, ilan var mı» der. KTX2 runtime sayfası «transcode sonrası GPU ne görür» der.

Used vs Required: transcoder sözleşmesi

Kök JSON ilanı ( Extension · Used/Required):

"extensionsUsed": ["KHR_texture_basisu"],
"extensionsRequired": ["KHR_texture_basisu"]

Holodepth üretim pratiği: KTX2-only paketlerde Required yazın. Core PNG fallback yoktur; Used-only + transcoder eksikliği «beyaz/mor texture» veya sessiz atlama üretebilir. Extension Sistemi örneğinde clearcoat Used yeterli iken BasisU sık Required'dır çünkü görüntü yorumu uzantıya bağlıdır.

BasisU ilan matrisi
Durum Semptom Teşhis
Required + transcoder yok Yükleme hatası / red Beklenen davranış
KTX2 image, Used yok Decode başarısız Gizli uzantı
PNG image, Basis Used Karışık paket Image bazında format kontrolü

images[]: KTX2 blob kaydı

BasisU'nun kalbi images dizisindedir. Tipik kayıt:

"images": [
  {
    "mimeType": "image/ktx2",
    "bufferView": 12
  },
  {
    "mimeType": "image/png",
    "bufferView": 13
  }
]

mimeType: "image/ktx2" zorunlu pratiktir; loader bu bayrağı görmeden KTX2 decode yoluna girmez. bufferView (GLB içi) veya uri (harici .ktx2) core image kurallarına tabidir ( Texture Referansları · images).

Karışık image paketi

Aynı dosyada bazı image'ler KTX2, bazıları PNG olabilir (ör. UI decal PNG, PBR seti KTX2). Holodepth envanter: image başına mimeType histogramı. «Tam KTX2 paket» varsayımı yanlıştır; Required yalnızca «en az bir KTX2 var» demek değil, «KTX2 olmadan dosya anlamsız» demektir.

Core PNG yolu yok

Required BasisU paketinde aynı texture için paralel PNG «yedek» taşımak zorunlu değildir ve genelde yapılmaz. Eski viewer desteği gerekiyorsa ayrı export hedefi (dual pipeline) ürün kararıdır; tek dosyada iki encoding nadirdir.

textures[] ve extension gövdesi

Core texture kaydı değişmez: sampler + source (image indeksi). BasisU uzantısı textures[i].extensions altında görünebilir:

"textures": [{
  "sampler": 0,
  "source": 0,
  "extensions": {
    "KHR_texture_basisu": {
      "source": 0
    }
  }
}]

Extension içindeki source, hangi image'in KTX2 kaynağı olduğunu açıkça işaret edebilir (çoğu export'ta üst source ile aynıdır). Holodepth okuma: texture → source image → mimeType ktx2 mi? → bufferView byteLength.

Materyal tarafında baseColorTexture.index, normalTexture.index vb. hâlâ texture tablosuna işaret eder ( PBR Yapısı). BasisU yalnızca image encoding'i değiştirir; slot anlamı (albedo linear/sRGB politikası runtime'da) aynı kalır.

Zincir: materyal → texture → KTX2 image

BasisU, texture zincirini kırmaz; ortadaki halkayı «sıkıştırılmış» yapar:

materials[i].pbrMetallicRoughness.baseColorTexture.index
  → textures[j].source
  → images[k].mimeType === "image/ktx2"
  → images[k].bufferView
  → bufferViews[m] → buffers[0] (GLB BIN)

Holodepth debug sırası: materyal slot dolu mu ( Material Slots) → texture index geçerli mi → image mimeType → blob var mı. «Mor/pembe texture» çoğu zaman zincir kırığı değil, transcoder veya GPU format eksikliğidir (runtime); ama mimeType yanlışsa format katmanı da kırmızıdır.

Sampler aynı kalır

Wrap, filter, anisotropy samplers[] tablosundadır; BasisU bunları değiştirmez. KTX2 içinde mip seviyeleri gömülü olabilir; runtime minFilter seçimi yine sampler + texture policy ile birleşir (detay Three.js KTX2 dalında).

Transcode sınırı: format saklar, runtime açar

glTF dosyasında ASTC/BCn/DXT GPU texture yoktur. Dosya KTX2 + Basis süper sıkıştırma taşır; GPU'ya uygun format seçimi loader/transcoder'da ( Transcoding Process) gerçekleşir.

Katman ayrımı
Katman Sorumluluk
glTF + BasisU KTX2 blob, mimeType, ilan
KTX2/Basis transcoder GPU compressed texture üretimi
Loader / material map, normalMap, … atama

Holodepth trade-off: indirme MB ve VRAM kazancı (runtime) karşılığında transcoder bağımlılığı ve ilk yükleme maliyeti. Format sayfası süre vermez; süre Performance Analysis konusudur.

Draco + BasisU: tam paket küçültme

Üretimde ideal «çift sıkıştırma» sık görülür:

  • Draco vertex/index baytı ( Draco)
  • BasisU texture baytı (bu sayfa)
  • Animasyon çoğu zaman sıkıştırılmaz (Keyframe sayfası)

Dosya boyutu raporunda üç kalem ayrı yazılmalıdır. Yalnızca Draco uygulayıp texture PNG bırakmak «hâlâ ağır GLB» üretir; tersine yalnızca BasisU ile ham geometri de büyük kalır. İki Required uzantı = iki decoder/transcoder bağımlılığı; ürün uyumluluk matrisi buna göre genişler.

Morph / skin Draco dışı kalabilir

BasisU morph delta veya IBM sıkıştırmaz. Tam karakter paketinde dört katman: Draco mesh, KTX2 materyal, ham morph (veya sparse), animasyon accessor'ları.

PBR slotları: ne KTX2 olmalı?

Format katmanında slot ismi değişmez; hangi image'in KTX2 olduğu export politikasıdır. Tipik web paketi:

Yaygın KTX2 adayları (özet)
Materyal alanı KTX2 yaygınlığı Format notu
baseColorTexture Çok yaygın sRGB içerik; mimeType yine ktx2
metallicRoughnessTexture Yaygın Linear packed ORM
normalTexture Yaygın Tangent space; transcoder kalitesi runtime
emissive / occlusion Değişken Proje bütçesine bağlı

Kanal paketleme (ORM tek texture) hâlâ materyal kartı tasarımıdır; BasisU yalnızca o kartın image byte'ını küçültür. UV semantiği ( UV Kanalları) değişmez.

Holodepth perspektifleri çoğu dokümanda olmayan açılar

«KTX2 = küçük texture» özeti üretimde yetersiz kalır.

mimeType unutulması

KTX2 byte'ları doğru bufferView'da ama image/png yazılıysa loader PNG decode dener ve başarısız olur. Envanterde her KTX2 blob için mimeType eşlemesi şarttır.

Alpha ve normal hassasiyeti

Agresif Basis sıkıştırma albedo alpha veya normal detayını yumuşatır; bu format hatası değil, encode kalite seçimidir. Master PNG/KTX source ile dağıtım KTX2'sini karşılaştırın (encode sayfası Three.js'te).

Harici .ktx2 URI

GLB gömülü değil, yan .ktx2 dosyaları geçerlidir. CORS ve cache politikası runtime CDN katmanıdır; format yalnızca uri + mimeType yazar.

Paylaşılan image

İki texture aynı KTX2 image'i paylaşabilir (farklı sampler). Bir image KTX2'ye çevrilince her iki slot da transcoder gerektirir; Required ilanı tüm paylaşımlı tüketiciler için geçerlidir.

Validator vs viewer

JSON şema geçerli, transcoder yok: viewer boş kalır. Holodepth: CI'da hem validator hem decoder'lı smoke load koşun.

Altı soruluk BasisU teşhisi

BasisU katmanı kontrol listesi
Soru Yeşil ise Kırmızı ise bak
Used'da BasisU var mı? İlan tamam KTX2 gizli
image mimeType ktx2 mi? Decode yolu doğru PNG sanma hatası
bufferView / uri dolu mu? Blob var Kopuk image
texture.source geçerli mi? Zincir tamam Yanlış indeks
Required uygun mu? Transcoder zorunlu net Eski viewer sessiz fail
Draco/anim ayrı ölçüldü mü? Gerçek kazanç görünür Yanlış optimizasyon hedefi

Holodepth içgörüsü

Texture debug'unda önce shader'a değil mimeType + blob + ilan üçlüsüne bakın: image/ktx2 mi, byteLength > 0 mı, Used/Required tutarlı mı? Üçü yeşilse sorun transcoder veya GPU format desteğindedir; biri kırmızıysa dosya sözleşmesi bozuktur.

BasisU'dan sonra

Doku sıkıştırması netleşince Uzantılar grubunda sıradaki konular:

  1. EXT_mesh_gpu_instancing çoğaltma attribute'ları
  2. KHR_materials_variants materyal varyant seçimi
  3. Runtime KTX2 KTX2 nedir?

Format okuyucusu özeti: BasisU = KTX2 image + ilan; texture zinciri core ile aynı; transcoder runtime'dadır. Draco ile birlikte tam GLB diyeti yapılır; animasyon ayrı kalemdir.