3D Model Formatları · glTF / GLB · Materyal Sistemi
Material Slots glTF'de Primitive ↔ Material Bağı
Aynı mesh'te gövde metal, cam şeffaf görünmesi gerekirken tek materyal
basılıyorsa
sorun çoğu zaman PBR kartında değil; primitives[].material indeksinin yokluğu
veya yanlış paylaşımındadır.
Texture
Referansları görüntü zincirini kapattı; bu sayfa üçüncü soruya geçer:
hangi geometri parçası hangi materyal kaydını kullanır?
Holodepth Materyal Sistemi'nde kart (materials[i]), görüntü zinciri
(textures / images) ve slot ayrı sorulardır.
Slot, materyali mesh'in çizilebilir birimine bağlar: glTF'de bu birim
meshes[j].primitives[k]'dır. Node sahneye yerleştirir; primitive çizim
sözleşmesini taşır; material indeksi yüzey kartını seçer.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz:
«Bir mesh birden fazla primitive içerebilir; her primitive isteğe bağlı
material indeksi taşır. Aynı materials[n] onlarca
primitive tarafından paylaşılabilir. material yoksa loader varsayılan
(genelde mat beyaz) yüzeye düşer. Materyal node üzerinde değil, primitive
üzerindedir.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa yalnızca glTF mesh.primitives[].material
indeks dilini ve çoklu materyal organizasyonunu anlatır:
- Mesh → primitive → material zinciri
- Tek materyal / çoklu materyal desenleri
- Eksik material ve varsayılan yüzey
- Node vs mesh vs primitive ayrımı
- Export, paylaşım maliyeti, Holodepth perspektifleri
Bilinçli olarak dışarıda bırakılan konular:
- PBR alanları (baseColor, metallic…) → PBR Yapısı
images/textures/samplers→ Texture Referansları- Node ağacı, parent/child → Node Hiyerarşisi
- Loader → Three.js material atama → Material mapping
KHR_materials_variants→ KHR_materials_variants- Draw call / batch runtime optimizasyonu → Materyal Optimizasyonu
Kısa ayrım: Material Slots (Format) «hangi primitive hangi materials[i]?» · PBR Yapısı «materials[i] içinde ne var?» · Material mapping (Runtime) «loader bunu Three.js'e nasıl yazar?»
Materyal dalı üçüncü 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ı |
| Materyal 3 | mesh.primitive.material |
Hangi parça hangi materyali kullanır? | Material Slots (bu sayfa) |
| Materyal 4 | extensions |
Core dışı hangi özellikler? | Extension Sistemi |
Slot nedir? (Format dilinde)
Zihin modeli: tiyatro kostümü askısı
materials[i]kostüm tasarımı (PBR kartı).- Primitive sahnedeki bir oyuncu grubu (çizilebilir parça).
materialindeksi askı numarası: «bu grup şu kostümü giysin.»- Kostüm bir kez dikilir; birçok grup aynı askıyı paylaşabilir.
«Material slot» ifadesi DCC ve oyun motorlarında genelde UI dilidir: mesh üzerinde
Materyal 0, Materyal 1…. glTF dosyasında karşılığı bir dizi UI etiketi değil,
primitive kaydındaki isteğe bağlı tamsayıdır. Bu tamsayı
materials dizisine indeks dilidir; tıpkı accessor'ın bufferView'e bakması
gibi.
Material Slots şunların hiçbiri değildir:
- Materyal içeriği değil metallic/roughness PBR Yapısı'nda
- Doku dosyası değil Texture Referansları'nda
- Scene graph düğümü değil node hiyerarşisinde
- Runtime
Mesh.materialAPI'si değil Three.js mapping sayfasında
Kart «nasıl görünecek?» sorusunu yanıtlar. Slot «kim giyecek?» sorusunu yanıtlar. İkisi olmadan model ya renksiz kalır ya da yanlış parçaya yanlış yüzey basılır.
Mesh, primitive ve çizim birimi
glTF'de meshes kaydı bir veya daha fazla primitives içerir.
Her primitive kendi attribute setini (POSITION, NORMAL,
TEXCOORD_0…), isteğe bağlı indices,
mode (triangles vb.) ve isteğe bağlı material taşır.
Geometri hattı attribute'ları anlattı; burada odak yalnızca
materyal bağlantısıdır.
"meshes": [{
"name": "Character",
"primitives": [
{
"attributes": { "POSITION": 0, "NORMAL": 1, "TEXCOORD_0": 2 },
"indices": 3,
"material": 0
},
{
"attributes": { "POSITION": 4, "NORMAL": 5, "TEXCOORD_0": 6 },
"indices": 7,
"material": 1
}
]
}]
Bu örnekte tek mesh, iki çizim birimi: ilki materials[0] (ör. deri),
ikincisi materials[1] (ör. kumaş). Export araçları «multi-material mesh»
dediğinde çoğu zaman birden fazla primitive üretir; her biri ayrı indeks aralığı ve
ayrı material taşır.
Neden material mesh kökünde değil?
Mesh köküne tek material yazmak, çoklu yüzeyli modelleri zorlar. Primitive başına material, «aynı iskelet geometri organizasyonu, farklı yüzeyler» deseni için doğal birimdir. Holodepth: çizim birimi = primitive; materyal slotu bu birime takılır.
İndeks dili: tek yönlü referans
Primitive material: n der → materials[n]. Material kaydı
«hangi primitive'ler beni kullanıyor?» listesi taşımaz. Bu, buffer → bufferView →
accessor zincirindeki gibi aşağı iner, yukarı çıkmaz modelidir.
nodes[a].mesh → meshes[j]
→ primitives[k].material → materials[n]
→ pbrMetallicRoughness / textureInfo…
→ textures / images (önceki sayfalar)
Node üzerinde material yoktur; node yalnızca mesh (veya camera, skin…)
indeksi taşır. «Bu node'un materyali» demek format dilinde yanlıştır; doğru cümle:
«Bu node'un mesh'inin şu primitive'inin materyali.»
Node Hiyerarşisi sahne ağacını anlatır; slot o ağaçta
değil, mesh tablosundadır.
Organizasyon desenleri
Pratikte dört desen sık görülür. Hepsi geçerli glTF'dir; seçim export ve içerik ihtiyacına bağlıdır.
| Desen | Yapı | Ne zaman? |
|---|---|---|
| 1∶1 | Bir primitive, bir material | Basit statik prop |
| N∶1 paylaşım | Çok primitive, aynı material indeksi | Ortak boya / ortak PBR kartı |
| 1∶N çoklu | Bir mesh, çok primitive, farklı material | Karakter, araç, mobilya parçaları |
| Eksik alan | material yok |
Placeholder / varsayılan yüzey |
Paylaşım neden önemli?
Aynı materials[2]'yi yirmi primitive'in işaret etmesi, yirmi kopya PBR
kartı yazmaktan daha küçüktür ve tutarlıdır. Kartı bir yerde güncellersiniz; tüm
tüketiciler aynı indeksi okur. Holodepth'in bufferView paylaşım mantığı burada materyal
ölçeğinde tekrarlanır: tek kaynak, çok görünüm.
Çoklu primitive maliyeti (format yüzü)
Her ek primitive genelde ayrı indeks aralığı ve ayrı draw anlamına gelir (runtime).
Format dosyasında bu, daha uzun primitives dizisi ve çoğu zaman daha fazla
accessor referansıdır. «Her vida için ayrı material» export'u dosyayı şişirir; «her vida
aynı material indeksi» paylaşımı korur. Optimizasyon motoru
Materyal Optimizasyonu sayfasındadır; burada yalnızca
export kararının JSON'a yansıması işaretlenir.
Eksik material ve
varsayılan yüzey
material alanı isteğe bağlıdır. Yoksa spec, loader'ın varsayılan bir
materyal uygulamasını bekler (tipik: mat, açık gri/beyaz, metallic 0, roughness yüksek
civarı — kesin görünüm uygulamaya bağlıdır). Dosyada «materials dizisi boş, primitive
material yok» tamamen geçerli bir minimal mesh olabilir.
- Kasıtlı eksik: placeholder, debug geometri, henüz boyanmamış parça
- Kazara eksik: export'ta material atanmamış; «neden gri?» semptomu
- Geçersiz indeks:
material: 5ikenmaterials.length === 3→ kırık dosya
Holodepth debug sırası: primitive'de material var mı → indeks sınır içinde mi →
materials[n] PBR/texture zinciri sağlam mı? Gri yüzey çoğu zaman «shader
bozuk» değil, slot boş veya varsayılandır.
Node, mesh örneği ve slot
Aynı meshes[j] birden fazla node tarafından referanslanabilir (örnekleme).
Her instance aynı primitive → material haritasını miras alır; materyal node başına
değişmez (core). Farklı materyal istiyorsanız ya ayrı mesh/primitive seti ya da
variants extension gerekir.
Transform node'dadır ( Transform Verileri); yüzey sözleşmesi mesh primitive'indedir. «Bu instance'ı kırmızıya boya» core glTF'de node alanıyla yapılamaz; kartı veya indeksi değiştirmek gerekir.
Skin / morph ile karıştırmayın
Skinning ve morph targets mesh/primitive üzerinde başka alanlardır
(targets, node'da skin). Material slotundan bağımsızdırlar.
Animasyon dalı bu konuları genişletir; burada yalnızca «slot ≠ deformasyon» sınırı
yeterlidir.
Export gerçeği: DCC'den JSON'a
Blender / Maya / Max'te «material slot» listesi glTF'e genelde şöyle yansır:
- Yüzler materyal ID'sine göre gruplanır
- Her grup bir primitive (veya birleşik mesh içinde ayrı indeks aralığı) olur
- Her grup için
materialskaydı yazılır veya mevcut kart paylaşılır primitives[k].material = nbağlanır
Slot sırası (UI'daki 0, 1, 2) dosyadaki material indeksiyle birebir olmak zorunda
değildir; export yeniden numaralandırabilir. Holodepth: DCC slot adını değil,
JSON indeksini kaynak gerçek kabul edin. İsimler
materials[n].name ile taşınabilir; bağlayıcı alan yine tamsayıdır.
«Apply modifiers / merge by material» gibi seçenekler primitive sayısını değiştirir. Tek material'e indirgemek slot sayısını azaltır; çoklu yüzeyi kaybedersiniz. Bu bir sanat/pipeline kararıdır; format her iki sonucu da taşır.
Envanter: neyi sayarsınız?
Dosya raporu yazarken üç sayı karıştırılmamalıdır:
| Sayı | Kaynak | Anlam |
|---|---|---|
materials.length |
kart tablosu | Kaç farklı yüzey tanımı var? |
| Primitive sayısı | tüm meshes | Kaç çizim birimi var? |
| Dolu slot sayısı | material alanı olan primitive |
Kaç birim kart bağlı? |
| Benzersiz material indeksleri | primitive.material seti | Gerçekte kaç kart kullanılıyor? (yetimler hariç) |
materials.length === 10 ama yalnızca 3 indeks kullanılıyorsa 7 kart
yetimdir (Texture Referansları'ndaki yetim image ile aynı sınıf sorun). Validator her
zaman uyarmayabilir.
Holodepth perspektifleri çoğu dokümanda olmayan açılar
Standart anlatım «primitive.material bir indekstir» ile biter. Aşağıdakiler üretim ve debug'da sık, az yerde derin işlenir.
«Tek mesh» yanılsaması
DCC viewport'ta tek obje görürsünüz; glTF'de beş primitive olabilir. «Neden beş draw?» sorusunun cevabı çoğu zaman beş material slotudur. Format dosyasını açmadan motoru suçlamak yanlış katmandır.
Aynı kart, farklı UV
İki primitive aynı material: 0'ı paylaşır; attribute'ları farklı
TEXCOORD_0 tablolarına bakabilir. Kart ortaktır; adres değildir. «Aynı
materyal neden farklı duruyor?» → önce UV, sonra PBR. Slot paylaşımı görünüm
özdeşliği garantilemez.
İndeks yeniden numaralama
Optimizasyon / gltf-pipeline araçları kullanılmayan material'leri silip indeksleri
kaydırabilir. Harici script'iniz «hep materials[4] cam» diye sabit kodladıysa kırılır.
Kararlı bağ için name veya içerik hash'i kullanın; saf indeks kırılgandır.
Alpha ve primitive sırası
alphaMode: BLEND materyalli primitive'ler çizim sırasına duyarlıdır. glTF
core, şeffaf primitive'lerin global sıralamasını tanımlamaz. Slot doğru olsa bile
«yanlış önde / arkada» runtime sıralama sorunudur; format yalnızca kartı ve bağı
sağlar.
Variants teaser
KHR_materials_variants aynı primitive için alternatif material
eşlemeleri sunar (renk seçenekleri). Core slot tek indekstir; variants onu genişletir.
Bu sayfa core'u sabitler; alternatif harita
KHR_materials_variants sayfasındadır.
Debug: yanlış parça, doğru kart
Cam materyali gövdeye basılmışsa PBR kartı «doğru» olabilir; material
indeksi yanlış primitive'dedir. Holodepth: semptom «yanlış yüzey» ise önce slot
haritasını, sonra kart içeriğini kontrol edin.
Holodepth içgörüsü
Çoklu materyal debug'unda önce PBR'ye değil primitive → material haritasına bakın: kaç primitive var, indeksler geçerli mi, paylaşım kasıtlı mı, eksik slot var mı, yetim kart var mı? Bu beş soru «yanlış boyalı model» vakalarının çoğunu dosya aşamasında kapatır.
Slotlardan sonra: Materyal Sistemi kapanırken
Core Materyal Sistemi omurgası üç soruyla tamamlanır: kart (PBR) → görüntü zinciri (Texture Referansları) → bağ (Slots). Sıradaki genişleme:
- Extension Sistemi clearcoat, sheen, specular, transmission, variants (Extension Sistemi)
- Uzantılar grubu (Draco, Basis, GPU instancing) ayrı dal
- Runtime Material mapping
Format okuyucusu özeti: materials kartı → textures/images → primitives[].material. Slot, kartı çizim birimine takan son core halkadır.