3D Model Formatları · glTF / GLB · Materyal Sistemi
Texture Referansları glTF'de
images / textures / samplers
Materyal slotu dolu ama yüzey pembe / siyah kalıyorsa sorun çoğu zaman PBR
formülünde değil; kırık source indeksi, yanlış URI veya eksik sampler
sözleşmesindedir.
PBR Yapısı
«hangi slot?» sorusunu kapattı; bu sayfa ikinci soruya geçer:
görüntü baytları nerede ve nasıl örneklenir?
Holodepth Materyal Sistemi'nde üç tablo bilinçli ayrılır:
images ham görüntü kaynağı,
textures kaynak + sampler birleşimi,
samplers wrap / filter sözleşmesi.
Materyaldeki textureInfo.index doğrudan PNG'ye değil
textures dizisine bakar. Bu zincir bozulunca shader doğru,
veri yoktur.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz:
«Materyal index: 2 der → textures[2] →
source ile images[j] + isteğe bağlı
sampler. Image ya URI ile harici dosyadır ya da bufferView ile binary
gömülüdür; sampler yoksa varsayılan wrap/filter uygulanır.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa yalnızca glTF images,
textures, samplers tablolarını ve indeks zincirini
anlatır:
- Üç tablolu referans modeli
- URI vs bufferView görüntü kaynağı
mimeType, paylaşılan image / texture- Sampler wrap / filter enum'ları (format alanı)
- Kırık zincir debug ve Holodepth perspektifleri
Bilinçli olarak dışarıda bırakılan konular:
- PBR slot anlamı (baseColor, MR, normal…) → PBR Yapısı
- UV /
texCoord→ UV Kanalları - Three.js
TextureAPI, wrapS/wrapT runtime → Wrapping & Repeat - Loader → material.map atama → Texture binding
KHR_texture_basisu/ KTX2 detay → KHR_texture_basisu ve KTX2 (Runtime)- Binary buffer genel mimari → Binary Bufferlar
Kısa ayrım: Texture Referansları (Format) «görüntü nerede, sampler nasıl tanımlanır?» · PBR Yapısı «hangi materyal slotu?» · Texture binding (Runtime) «Three.js'e nasıl bağlanır?»
Materyal dalı ikinci soru
| Dal | Tablo / nesne | Soru | Sayfa |
|---|---|---|---|
| Materyal 1 | pbrMetallicRoughness |
Yüzey hangi PBR parametrelerini taşır? | PBR Yapısı |
| Materyal 2 | textures / images |
Görüntü nerede, sampler nasıl? | Texture Referansları (bu sayfa) |
| Materyal 3 | mesh.primitive.material |
Hangi parça hangi materyali kullanır? | Material Slots |
| Materyal 4 | extensions |
Core dışı hangi özellikler? | Extension Sistemi |
Neden üç tablo?
Zihin modeli: kütüphane · kitap kartı · okuma kuralları
imagesraftaki kitap (ham sayfalar / baytlar).texturesödünç kartı: hangi kitap + hangi kural.samplersokuma kuralları (kenar, filtre).- Materyal slotu «2 numaralı kartı kullan» der; kitabı kopyalamaz.
Tek tabloda «doku = dosya yolu» birleştirmek cazip görünür. glTF bunu ayırır çünkü aynı görüntü birden fazla texture kaydıyla, aynı sampler birden fazla texture ile paylaşılabilir. Bellek ve export tutarlılığı için kaynak bir kez yazılır; üst katmanlar indeksle işaret eder.
Texture Referansları şunların hiçbiri değildir:
- PBR formülü değil metal/rough anlamı PBR Yapısı'nda
- GPU Texture nesnesi değil WebGL/Three.js runtime API ayrı
- UV adresi değil örnekleme koordinatı geometride
- Atlas sanatı değil packing UV Mapping / Texture Atlas dalında
Materyal «ne için kullanılacak?» der. Texture tabloları «hangi baytlar, hangi örnekleme sözleşmesi?» der. İkisi birleşince yüzey boyanır; biri diğerinin yerini tutmaz.
Zincir: material → texture → image (+ sampler)
Okuma yönü tek yönlüdür. Materyal textureInfo.index ile
textures dizisine iner; texture source ile
images'a, isteğe bağlı sampler ile samplers'a
bakar. Image kaydı materyali bilmez.
materials[i].pbrMetallicRoughness.baseColorTexture.index
→ textures[k]
.source → images[j] // URI veya bufferView
.sampler → samplers[m] // isteğe bağlı
→ GPU'ya yüklenen görüntü + örnekleme durumu
"images": [
{ "uri": "albedo.png" },
{ "mimeType": "image/png", "bufferView": 4 }
],
"samplers": [
{ "magFilter": 9729, "minFilter": 9987, "wrapS": 10497, "wrapT": 10497 }
],
"textures": [
{ "source": 0, "sampler": 0 },
{ "source": 1 }
]
İkinci texture kaydında sampler yok: loader varsayılan sampler uygular (tipik olarak repeat + linear/mipmap; kesin varsayılan spec ve uygulama ile doğrulanır). Holodepth notu: «sampler yazılmadı» ≠ «filtre yok»; sessiz varsayılan vardır.
images: URI veya bufferView
Her image kaydı görüntünün fiziksel kaynağını tanımlar. İki ana yol:
uriharici dosya veya data URI (tipik.gltf+ yanındaki PNG/JPEG)bufferViewgömülü binary (tipik GLB veya .bin içi görüntü bloğu); geneldemimeTypezorunlu/beklenen
| Yol | Tipik paket | Not |
|---|---|---|
uri |
.gltf + dosyalar |
Göreli yol; eksik dosya = kırık texture |
bufferView |
GLB / .bin | Tek paket; mimeType ile decode |
| data URI | küçük gömme | JSON şişer; nadir / küçük ikonlar |
bufferView yolu binary buffer dilim mimarisinin görüntü yüzüdür: ofset/uzunluk BufferView ile gelir; image kaydı «bu dilim bir PNG'dir» der. Geometri attribute dilimleriyle aynı tabloda durabilirler; semantic farklıdır.
mimeType
Core'da yaygın değerler image/png ve image/jpeg'dir. Yanlış
mimeType veya bozulmuş baytlar loader'da decode hatasına düşer; materyal slotu «dolu»
görünür, GPU'ya texture çıkmaz. Extension ile KTX2 / Basis gibi formatlar eklenebilir;
core image tablosu o sözleşmeyi bilmez.
textures: birleşim kaydı
textures[k] tek başına piksel taşımaz. Zorunlu alan
source (image indeksi); isteğe bağlı sampler,
name. Materyalin işaret ettiği indeks budur. Aynı
images[j] iki texture kaydında paylaşılabilir; farklı sampler ile (ör.
biri clamp, biri repeat) iki «görünüm» üretilir, görüntü bir kez saklanır.
Holodepth ayrımı: «kaç PNG var?» sorusu images.length; «kaç materyal
slotu texture kullanıyor?» sorusu materyal alanlarıdır; «kaç texture kaydı var?»
textures.length. Üç sayı farklıdır; karıştırmak «dosyada 4 doku var»
raporunu bozar.
samplers: wrap ve filter
Sampler kaydı WebGL tarzı sabitlerle örnekleme davranışını yazar. Bu sayfa enum
format alanlarını listeler; Three.js'de wrapS /
minFilter atama detayı Wrapping & Repeat ve Texture binding
sayfalarındadır.
| Alan | Rol | Örnek sabitler |
|---|---|---|
wrapS / wrapT |
UV kenar davranışı | 10497 REPEAT · 33071 CLAMP · 33648 MIRRORED |
magFilter |
büyütme filtresi | 9728 NEAREST · 9729 LINEAR |
minFilter |
küçültme / mipmap | 9728… · 9984–9987 mipmap ailesi |
Lightmap UV'si 0..1'de unique iken REPEAT wrap, kenarda sızıntı üretebilir; albedo tiling için REPEAT bilinçli seçilir. Format dosyası niyeti yazar; runtime aynı enum'u GPU'ya iletir. «Doku kayıyor» semptomunda önce UV'yi, sonra sampler wrap'ı kontrol edin; ikisi farklı katmandır.
Paylaşım ve çoğaltma
Export araçları aynı albedo PNG'sini hem gövde hem aksesuar materyalinde
baseColorTexture.index ile aynı texture kaydına bağlayabilir. İyi durum:
tek image, tek texture, çok materyal. Kötü durum: aynı dosyanın üç kopyası üç image
kaydı (paket şişer).
- Paylaşılan image, farklı sampler: iki texture kaydı, bir kaynak
- Paylaşılan texture, farklı materyal: PBR slotları aynı indeksi gösterir
- Çoğaltılmış image: URI aynı metin, iki kayıt; validator uyarı vermeyebilir
Holodepth: dosya boyutu analizinde önce images benzersizliğine bakın;
«kaç materyal texture kullanıyor» sayımı yanıltıcıdır.
Kırık zincir: semptom → katman
| Semptom | Önce bak |
|---|---|
| Pembe / eksik doku | URI yolu, image decode, source indeksi |
| Yanlış wrap / tiling | samplers wrapS/T (sonra UV) |
| Slot dolu, görüntü yok | textures[k].source → images var mı? |
| GLB'de doku yok | image bufferView + mimeType |
| Doğru dosya, yanlış yüzey | PBR slot / texCoord (bu sayfa değil) |
Sıra: materyal index → texture kaydı → source image → URI/bufferView
erişilebilir mi → sampler varsayılanı kabul edilebilir mi. Bu sıra Texture binding
API'sinden önce biter.
Holodepth perspektifleri çoğu dokümanda olmayan açılar
Standart anlatım «textures → images» ile biter. Aşağıdakiler üretimde sık, az yerde derin işlenir.
index karışıklığı
Materyal index'i image indeksi sanmak klasik hatadır. Doğru hedef
textures'tır. İki dizi boyutu farklıysa «index 3» image'da taşar, texture'da
geçerli kalır (veya tersi).
Göreli URI ve taşıma
.gltf + textures/albedo.png paketi klasör yapısına bağlıdır.
Tek dosyayı başka dizine kopyalamak zinciri kırar; GLB bu yüzden web dağıtımında sık
tercih edilir. Format sorunu «PNG bozuk» değil, «yol çözülemedi»dir.
Renk uzayı dosyada yazılmaz (core)
Core glTF image kaydı «sRGB mi linear mı?» demez; loader / engine albedo için sRGB, data map (MR, normal) için linear varsayar. Yanlış renk uzayı «soluk metal» üretir; JSON'da alan aramayın. Runtime sözleşmesi Texture binding / material mapping'dedir.
Yetim kayıtlar
Hiçbir texture'un işaret etmediği image, veya hiçbir materyalin işaret etmediği texture «ölü ağırlık»tır. Dosya geçerli kalabilir; paket boyutu şişer. Validator her zaman uyarmayabilir; Holodepth envanterinde referans sayımı yapın.
Bir image, iki rol
Aynı PNG hem occlusion R hem başka slotta kullanılıyorsa (nadir / kötü bake) kanal anlamı materyalde ayrılır; image tablosu tek kayıttır. «Dosyada iki AO var» sanısı yanlıştır; iki textureInfo aynı source'a bakıyor olabilir.
Extension kaynağı
Basis/KTX2 extension'ları image veya texture kaydına ek alan bağlar; core
uri/bufferView yolu değişebilir. Bu sayfa core zinciri
sabitler; sıkıştırılmış doku sözleşmesi Extension Sistemi / KTX2 dalındadır.
Holodepth içgörüsü
Doku debug'unda önce PNG'yi açmayın; indeks zincirini yürütün: materyal index → textures → source → URI/bufferView → mimeType → sampler. Zincir sağlamsa sorun PBR slotu veya UV'dedir; zincir kırgıksa shader'a bakmak zaman kaybıdır.
Texture zincirinden sonra
Görüntü kaynağı ve sampler sözleşmesi oturunca sıradaki soru: hangi mesh parçası bu materyali kullanır?
- Material Slots
primitive.materialindeks dili (Material Slots) - Extension Sistemi variants, Basis, ekstra materyal modelleri (Extension Sistemi)
- Runtime Texture binding
Format okuyucusu özeti: PBR kartı → textures/images/samplers → primitive material indeksi. Texture Referansları, karttaki «index»in çözüldüğü kattır.