holodepth

3D Model Formatları · glTF / GLB · Materyal Sistemi

PBR Yapısı glTF'de pbrMetallicRoughness Nedir?

Model «metalik değil» veya «fazla parlak» görünüyorsa sorun çoğu zaman shader'da değil; metallicFactor / roughnessFactor veya MR doku kanal paketlemesindedir. UV Kanalları doku adresini kapattı; Materyal Sistemi'nin ilk sorusu şudur: yüzey parametreleri dosyada nasıl saklanır?

Holodepth'te geometri hattı (POSITIONTEXCOORD_n) «mesh ne taşır?» sorusunu yanıtlar. Materyal dalı «bu mesh'e hangi yüzey sözleşmesi uygulanır?» sorusunu yanıtlar. glTF 2.0 core'da varsayılan cevap metalik-pürüzlülük PBRdır: materials[i].pbrMetallicRoughness nesnesi. Bu sayfa o nesnenin alanlarını, factor/doku çarpımını ve alpha/emissive sınırlarını format dilinde sabitler.

Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «glTF PBR, baseColorFactor + isteğe bağlı baseColorTexture ile renk verir; metallicFactor ve roughnessFactor skaler veya metallicRoughnessTexture içinde G/B kanallarıyla gelir. Normal ve occlusion ayrı textureInfo köprüleridir; görüntü dosyası bu sayfada değil, Texture Referansları dalındadır.»

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

Bu sayfa yalnızca glTF pbrMetallicRoughness ve materyal üst alanlarını (alphaMode, doubleSided, emissive*) anlatır:

  • Factor alanları ve varsayılan değerler
  • Materyal üzerindeki textureInfo köprüleri (hangi slot, hangi anlam)
  • MR doku kanal paketleme (G/B)
  • Factor × texture çarpım kuralı
  • Holodepth perspektifleri ve sonraki materyal adımları

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

Kısa ayrım: PBR Yapısı (Format) «JSON'da hangi alanlar var?» · MeshStandardMaterial (Runtime) «shader bu alanları nasıl yorumlar?» · Texture Referansları «görüntü binary'si nerede?»

Materyal dalı ilk soru

Dal Tablo / nesne Soru Sayfa
Geometri (bitti) TEXCOORD_n Texel nereden örneklenir? UV Kanalları
Materyal 1 pbrMetallicRoughness Yüzey hangi PBR parametrelerini taşır? PBR Yapısı (bu sayfa)
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
Materyal 4 extensions Core dışı hangi özellikler? Extension Sistemi

PBR nedir? (Format dilinde)

Zihin modeli: yüzey «parametre kartı»

  • Geometri şekil ve adres taşır (vertex attribute'lar).
  • Materyal yüzey davranış kartıdır (factor + texture köprüleri).
  • pbrMetallicRoughness glTF 2.0'ın varsayılan kart şablonudur.
  • Shader kartı okur; kart shader değildir.

PBR (Physically Based Rendering) terimi sanat ve engine dünyasında geniş bir ailedir. glTF dosyasında ise dar ve yazılabilir bir anlama indirgenir: belirli JSON alanları ve bunların texture köprüleri. Dosyayı açtığınızda «fiziksel doğruluk» taahhüdü değil, alan sözleşmesi görürsünüz: base color, metalness, roughness, normal, occlusion, emissive.

PBR Yapısı şunların hiçbiri değildir:

  • Shader kaynağı değil GLSL/WGSL burada yok
  • Doku dosyası değil PNG/KTX2 Texture Referansları dalında
  • Phong/Lambert legacy değil core workflow MR'dır; specular-glossiness extension'dır
  • Işık kurulumu değil sahne lights tablosu ayrı konu

Geometri «nerede ve nasıl örneklenir?» sorusunu kapatır. PBR Yapısı «örneklenen texel bu yüzeyde ne anlama gelir?» sorusunun parametre kısmını yanıtlar; görüntünün kendisi bir sonraki adımdadır.

pbrMetallicRoughness nesnesi

materials dizisindeki her kayıt bir yüzey tanımıdır. glTF 2.0 core'da ana gövde pbrMetallicRoughness alt nesnesidir; üst seviyede normalTexture, occlusionTexture, emissiveTexture, alphaMode, doubleSided gibi alanlar materyal kökünde durur. JSON yapı blokları bu tabloyu «organizasyon» katmanında listeler; bu sayfa alan anlamını doldurur.

"materials": [{
  "name": "Body_PBR",
  "pbrMetallicRoughness": {
    "baseColorFactor": [0.8, 0.8, 0.8, 1.0],
    "metallicFactor": 0.0,
    "roughnessFactor": 0.6,
    "baseColorTexture": { "index": 0, "texCoord": 0 },
    "metallicRoughnessTexture": { "index": 1, "texCoord": 0 }
  },
  "normalTexture": { "index": 2, "texCoord": 0, "scale": 1.0 },
  "occlusionTexture": { "index": 3, "texCoord": 0, "strength": 1.0 },
  "emissiveFactor": [0, 0, 0],
  "alphaMode": "OPAQUE",
  "doubleSided": false
}]

Dikkat: index burada texture tablosuna işaret eder; görüntü URI'si veya buffer chunk'ı bu örnekte görünmez. Holodepth kuralı: PBR Yapısı «hangi slotlar var» der; Texture Referansları «o indeksler nereye çözülür» der.

Core MR vs extension workflow

Eski veya DCC export'ları bazen KHR_materials_pbrSpecularGlossiness kullanır (diffuse + specular + glossiness). glTF 2.0 varsayılanı metalik-pürüzlülüktür. Dosyada hangi workflow'un aktif olduğunu extension listesinden okursunuz; iki workflow'u aynı materyalde «karışık» sanmayın. Modern hedef MR + yeni KHR_materials_* ailesidir; ayrıntı Extension Sistemi · core vs katman bölümündedir. Burada yalnızca «core okuyucu MR bekler» notu yeterlidir.

Factor alanları: skaler sözleşme

Factor alanları doku olmadan da materyali tanımlayabilir: düz renkli plastik, tam metal, mat yüzey. Her factor'ın spec'te varsayılanı vardır; eksik alan «sıfır» değil, varsayılan demektir.

pbrMetallicRoughness factor özeti
Alan Tip Varsayılan Anlam (format)
baseColorFactor RGBA [r,g,b,a] [1,1,1,1] Albedo çarpanı + alpha kaynağı (alphaMode ile)
metallicFactor sayı 1 Metaliklik skaleri (0 dielektrik … 1 metal)
roughnessFactor sayı 1 Pürüzlülük skaleri (0 ayna … 1 mat)
emissiveFactor RGB [0,0,0] Emissive çarpanı (materyal kökünde)

Holodepth uyarısı: metallicFactor ve roughnessFactor varsayılanı 1'dir. Doku yokken «gri plastik» bekleyip dosyada factor yazmamak, export'ta tam metal + tam mat sözleşmesine düşmenize neden olabilir. Factor-only materyallerde her alanı bilinçli yazmak iyi pratiktir.

baseColorFactor dördüncü bileşeni (a) alpha için kaynaktır; alphaMode bunu nasıl kullanacağını §6'da sabitler. Vertex rengi (COLOR_0) ile çarpım loader/engine tarafında olabilir; glTF core'da ayrı alan değildir, fakat «factor yeterli» sanığını bozar.

Materyal texture köprüleri

PBR Yapısı'nda texture alanları textureInfo nesnesidir: index (hangi texture kaydı), isteğe bağlı texCoord (hangi UV seti). Bu köprü UV Kanalları bölümünde geometri tarafından tanıtılmıştı; burada materyal slot anlamı ön plandadır.

Materyal texture slotları (core)
Alan Konum Rol
baseColorTexture pbrMetallicRoughness Albedo + alpha (RGBA)
metallicRoughnessTexture pbrMetallicRoughness Metaliklik (B) + pürüzlülük (G)
normalTexture materyal kökü Tangent-space normal; scale isteğe bağlı
occlusionTexture materyal kökü AO (R kanalı); strength isteğe bağlı
emissiveTexture materyal kökü Emissive RGB

Normal map «ne işe yarar» ve TBN gereksinimi Tangent Data ile Normal Map sayfalarındadır. Format sorusu: materyalde normalTexture var mı, texCoord kaç, geometride TANGENT var mı?

metallicRoughnessTexture kanal paketleme

glTF, metaliklik ve pürüzlülüğü tek RGBA görüntüde paketler. Spec kuralı (core):

  • Yeşil (G) → roughness
  • Mavi (B) → metallic
  • Kırmızı (R) → kullanılmaz (çoğu bake'te 0 veya atıl)
  • Alpha (A) → kullanılmaz

Bu paketleme Unity/Unreal ayrı grayscale metal/rough dosyalarından farklıdır. DCC export «yanlış kanala yazdı»ysa model web'de «metalik ama mat» veya «plastik ama ayna» görünür; shader bozuk değil, kanal sözleşmesi bozuktur.

// Kavramsal örnekleme (fragment)
roughness = roughnessFactor * mrSample.g;
metallic  = metallicFactor  * mrSample.b;
baseColor = baseColorFactor * baseColorSample.rgb;

Holodepth içgörüsü: MR dokusunu Photoshop'ta «RGB aynı» diye kontrol etmek yeterli değildir; G ve B kanallarını ayrı inceleyin. Tek kanallı metal map'i doğrudan baseColor gibi bağlamak sık hata desenidir.

alphaMode, şeffaflık ve emissive

Materyal kökündeki alphaMode üç değer alır:

  • OPAQUE (varsayılan) alpha yok sayılır
  • MASK alphaCutoff ile ikili maskeleme
  • BLEND alpha karışımı (sıralama runtime sorunu)

Alpha kaynağı baseColorFactor.a ve/veya baseColorTexture alpha kanalıdır. Format dosyası «blend kullan» der; doğru çizim sırası glTF'de tanımlı değildir bu engine/runtime konusudur. MASK modunda cutoff eksikse varsayılan 0.5 kullanılır.

doubleSided tek bitlik sözleşmedir: true ise arka yüz culling kapatılır (veya iki taraf render edilir). PBR parametreleri ön/arka için ayrılmaz; çift taraflı cam ile çift taraflı opak plastik aynı JSON alanıyla ifade edilir, görünüm shader'a kalır.

emissiveFactor ve emissiveTexture ışık yansıtması değil, yüzeyin kendi yaydığı renktir (HDR değerler olabilir). IBL veya lights tablosu ile karıştırılmamalıdır.

Factor × texture çarpımı

glTF PBR'da factor ve texture çarpılır; biri diğerinin yerine geçmez. Doku tam beyaz (1) ise factor tek başına belirleyicidir. Factor [1,1,1,1] iken doku devrededir. İkisi de varsayılanda «export hiç dokuya bakmadım» anlamına gelmez: metallic/roughness varsayılanı 1'dir.

Normal ve occlusion için ek skalerler vardır: normalTexture.scale, occlusionTexture.strength. Bunlar örneklenen değeri modüle eder; format okuyucusu «texture var + scale kaç» diye okur.

Eksik texture tuzakları

  • Sadece MR texture, factor 1: tam metal + tam mat riski
  • Sadece baseColorTexture, metallic 1: renkli «metal» beklentisi
  • normalTexture var, TANGENT yok: format uyumsuzluğu (geometri)
  • occlusion R kanalı boş: AO etkisiz kalır

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

Standart anlatım «baseColor, metallic, roughness vardır» ile biter. Aşağıdaki başlıklar üretim ve validator/debug'da sık görülür.

Varsayılan metallic = 1 tuzağı

Factor yazılmayan materyal «nötr plastik» değildir; spec varsayılanı metalik uçtadır. Özellikle factor-only test küplerinde bu, «her şey metal» algısı yaratır. Export şablonlarında metallic/roughness'ı açıkça sıfırlamak format okuryazarlığıdır.

MR dokusu albedo değildir

Gri tonlu metal/rough paketini baseColorTexture slotuna koymak yaygın hatadır. Renk doğru görünür, metaliklik yanlış kalır. Slot anlamı JSON alan adıyla sabitlenir; görsel benzerlik güvenilmez.

AO'yu roughness sanma

occlusionTexture yalnızca R kanalındadır ve ayrı strength taşır. Bake'te AO ile roughness birleştirilip tek grayscale verilirse, format'ta hangi slota yazıldığına bakmadan düzeltmek zordur. Holodepth: bake çıktısını slot adına göre adlandırın, kanala göre değil.

Dosya ortam ışığı taşımaz (core)

PBR parametreleri dosyada tamdır; fakat metalik yüzeylerin «gerçekçi» görünmesi runtime IBL/PMREM'e bağlıdır. Bu, format eksikliği değildir: glTF core materyal kartıdır, sahne aydınlatması Environment & HDRI kanalındadır. Aynı GLB, farklı ortamda farklı «metaliklik» hissi verebilir; JSON değişmemiştir.

Tek material kaydı, çok primitive

materials[2] on primitive tarafından referanslanabilir. PBR alanları paylaşılır; UV adresi geometri tarafındadır. «Aynı materyal, farklı UV» kombinasyonu mümkündür; görünüm farkı adres kaynaklıdır, materyal kopyası gerekmeyebilir.

Validator perspektifi

Tutarlı PBR JSON'u şu sorularla hızlı taranır: texture index geçerli mi, texCoord geometride var mı, alphaMode blend iken sıralama planlandı mı, MR kanalları gerçekten G/B mi? Bu sayfa insan okuyucusu içindir; otomasyon aynı alan adlarını kullanır.

Holodepth içgörüsü

PBR debug'unda önce shader'a değil JSON kartına bakın: factor varsayılanları, MR G/B kanalları, baseColor alpha, normal/occlusion slotları, texCoord eşleşmesi. Bu beş kontrol, «yanlış materyal» vakalarının çoğunu dosya aşamasında kapatır.

PBR'den sonra: texture zinciri ve slotlar

pbrMetallicRoughness «hangi parametreler ve hangi texture köprüleri» sorusunu yanıtlar. Sıradaki Materyal Sistemi adımları:

  1. Texture Referansları images, textures, samplers ve URI/chunk çözümü (Texture Referansları)
  2. Material Slots mesh.primitive.material indeks dili (Material Slots)
  3. Extension Sistemi clearcoat, sheen, specular, variants (Extension Sistemi)
  4. Runtime köprüsü Texture binding ve material mapping

Format okuyucusu özeti: geometri attribute'ları → PBR kartı → texture tabloları → primitive material indeksi → extension. PBR Yapısı, kartın şemasıdır; görüntü byte'ları henüz devreye girmez.