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 / URItextures[]+ 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:
- Genel extension mekanizması → Extension Sistemi
- Core images / textures / samplers → Texture Referansları
- PBR hangi slot → PBR Yapısı
- Geometri Draco → Draco Mesh Compression
- KTX2 konteyner felsefesi, VRAM, Basis algoritması → KTX2 nedir? (Three.js)
- Transcode, encode, GPU format seçimi → Three.js KTX2 dalı
- Three.js
KTX2Loaderkurulumu → runtime pipeline
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.
| 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 | 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:
| 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
| 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:
- EXT_mesh_gpu_instancing çoğaltma attribute'ları
- KHR_materials_variants materyal varyant seçimi
- 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.