Three.js · Doku · PBR
Texture türleri: Metalness Map (metalik haritası)
PBR iş akışında dünyadaki maddeler kabaca iki grupta düşünülür: metaller ve metal olmayanlar (dielektrikler). Metalness map, bu ayrımı piksel bazında seçtirir: dielektrikte albedo çoğunlukla difüz renk olarak kalırken, metalde aynı kanal yansıma rengine kayar ve difüz bileşen neredeyse kapanır. Harita bir «parlaklık süsü» değil, hangi şading dalının işe konacağını belirleyen anahtardır.
Harita tipik olarak tek kanallı gri veridir: beyaz metal, siyah
dielektrik; ara tonlar çoğu zaman pas, kir veya ince oksit hikâyesidir.
glTF metal–rough paketinde kanal çoğu zaman R’de
paketlenir; dosya renkli görünse bile motorun okuduğu tek değer gri ölçektir.
Bağlam: Albedo / Base Color, Normal map, Roughness map, MeshStandardMaterial, Environment & HDRI.
Metalik olma mantığı: 0 mı, 1 mi?
Gerçek dünyada bir madde ya metaldir ya da değildir. Bu yüzden metalness haritaları çoğu zaman siyah–beyazın en keskin olduğu dokulardır:
- Beyaz (1,0): Yüzey tam bir metaldir. Işığın önemli kısmı yansır (specular / yansıtıcı bileşen). Albedo (renk) verisi, metalin yansıma rengini temsil etmek için kullanılır.
- Siyah (0,0): Yüzey dielektriktir (plastik, taş, tahta). Yansımalar renksiz (enerji koruyan Fresnel davranışı) ve materyalin görünen rengi albedo dokusundan gelir.
- Gri geçişler: Fiziksel olarak «yarı metal» bir madde nadirdir. Gri tonlar genellikle pas, toz, kir veya metal üzerindeki ince bir oksit tabakasını temsil eder.
Doku filtresi (mipmap / üç doğrusal örnekleme) keskin siyah–beyaz sınırlarda ara gri bantlar üretebilir; bu sanatsal yumuşatma için kullanılabilir ama fiziksel okumada «gerçekten iletken mi?» sorusunu dağıtmamak gerekir. Kenarları bilinçli dar geçiş ile çizmek, uzaktan bakıldığında maskeyi daha stabil gösterir.
Metallerin fiziksel davranışı
Bir yüzeyi metal olarak işaretlediğinizde, Three.js gibi motorlar aydınlatma matematiğini (Fresnel denklemleri ve enerji koruma zinciri) buna göre yeniden dengeler:
- Diffuse neredeyse kaybolur: Metallerde ışığın
yüzey altına sızıp dağılması (diffuse) neredeyse sıfırdır; ışık ya yansır ya emilir.
Bu yüzden
metalness = 1iken albedo dokusu «kararmış» gibi görünebilir — çünkü o kanal artık klasik anlamda «yüzey rengi» değil, yansıma rengine yaklaşır. - Renkli yansımalar: Plastik bir objeye kırmızı ışık tuttuğunuzda yansıma kırmızı olabilir; beyaz ışıkta ise yansıma beyaza yaklaşır. Oysa altın veya bakır gibi metaller, beyaz ışığı bile kendi metalik renkleriyle yansıtır.
Standart metal–rough gölgelerinde enerji, yansıyan ve dağılan bileşenler arasında yeniden dağıtılır; metal bayrağı açıldığında difüzün payı düşer, speküler / çevre yansımasının payı yükselir. Bu yüzden aynı albedo rengine sahip iki küre, biri metal biri dielektrik iken yan yana koyulduğunda parlaklık hikâyesi kökten ayrılır — demo sayfadaki split modu tam bunu izole eder.
F0: dik bakış yansıması
PBR dünyasında metaller ile dielektrikler arasındaki en belirgin farklardan biri F0 değeridir — yüzeye dik bakıldığında yansıtılan ışığın oranı (basitleştirilmiş okuma).
- Dielektriklerin çoğu yaklaşık %2–%5 bandında yansıtır.
- Metaller ise tipik olarak %60–%100 aralığına yakın yüksek yansıtma potansiyeline sahiptir.
Metalness map, motorun bu yüksek yansıtma potansiyelini piksel bazında açıp kapatan anahtardır; gerçek fizik tablosu tabii ki materyal modelinin detayına bağlıdır.
F0 terimini IOR / dielektrik speküler rehberlerinde de görürsünüz; buradaki mesaj daha basit: metalness hangi piksellerin «yüksek F0 ailesine» taşındığını seçer. İnce ayar için bazı içeriklerde ayrıca speküler renk veya sheen gibi uzantılar bulunur — omurga yine metal–rough ikilisidir.
Teknik kurallar ve renk uzayı
Holodepth rehberinin olmazsa olmazı: Metalness map bir veri dokusudur, tablo resmi değildir.
THREE.NoColorSpace (doğrusal / veri): Metalik değer bir
matematiksel katsayıdır. Haritayı sRGB gibi gama uzayında yüklerseniz
gri tonlardaki doğrusal geçiş bozulur; materyal ya aşırı metalik ya da hiç
metalik değilmiş gibi kararsız davranabilir.
Dışa aktarımda «fotoğraf olarak kaydet» seçenekleri maskeyi görsel olarak düzeltir gibi görünse de sayısal maskeyi bozar; JPEG blokları özellikle ince pas sınırında yalancı ara tonlar üretir. Üretimde maskeyi renk düzeltmesinden geçirmemek en güvenli yoldur.
const metalnessTexture = new THREE.TextureLoader().load("metalness.jpg");
metalnessTexture.colorSpace = THREE.NoColorSpace; // Veri doğruluğu için şart
MeshStandardMaterial içinde metalnessMap tanımlıysa
çoğu sürümde skaler metalness ile çarpımsal birleşir; harita
beyazına yaklaştıkça bölge tam iletken uca gider, siyaha yaklaştıkça dielektrik uca döner.
İkisini birden kullanırken motor dokümantasyonundaki tam formülü doğrulayın.
HoloDepth kritik uyarı
glTF yükleyicide çoğu kanal doğru gelir; fakat elle
TextureLoader ile getirdiğiniz haritalarda renk uzayını her
zaman
kontrol edin.
Roughness ile ortaklık
Metalness map tek başına bir potansiyel sunar; o potansiyelin sahneye nasıl «oturduğunu» çoğu zaman roughness belirler.
- Metalness 1 + roughness ~0: Kusursuz ayna veya cilalı krom hissi (yine de tam 0 yerine çok küçük bir roughness pratikte daha doğal olabilir).
- Metalness 1 + roughness ~0,8: Kumlanmış alüminyum veya eski, mat bir döküm demir gibi yumuşak, dağılmış yansımalar.
Bu iki harita arasındaki denge, materyalin hikâyesini anlatır. Ayrıntılı anlatım için Roughness map sayfasına bakın.
«Parlak ama metal değil» sahnelerde (ıslak taş, vernik, cam) çoğu zaman önce roughness ve gerekiyorsa clearcoat / ikinci yüzey modeli düşünülür; metalness’i yükseltmek yanlış kısayol olur — aşağıdaki hatalar bölümündeki örneklerle aynı hatayı farklı yüzeylerde tekrarlamamak için bu sırayı ezberlemek faydalıdır.
Sık yapılan hatalar: «her şey metal değildir»
Geliştiricilerin düştüğü en büyük hata, parlak görünen her şeye metalness vermektir.
- Islak yüzeyler: Su bir metal değildir. Islak bir taşın parlamasını istiyorsanız çoğu zaman metalness’i değil, roughness’ı (ve uygun şekilde clearcoat / katman modelini) düşünmelisiniz.
- Boyalı metaller: Boyanmış bir araba kaportası «metalik» değildir; üstteki tabaka dielektriktir. Altındaki metal ancak çizik veya boya aşınmasıyla ortaya çıkar — haritada genelde çizik yerler beyaz (metal), boyalı alanlar siyaha yakın kalmalıdır.
- Seramik sırlı, cilalı plastik, cam: Hepsi parlak görünebilir; çoğu durumda metalness yine sıfıra yakın kalır. Parlaklık çoğu zaman düşük roughness ve çevre yansımasından gelir, iletken yüzey simülasyonundan değil.
İnteraktif demo: split, çizik haritası, ızgara, ıslak vs metal
Bu demo harici görüntü dosyası indirmez: metalness maskeleri tarayıcıda
Canvas ile çizilir; çevre yansıması için yalnızca Three.js
RoomEnvironment (prosedürel sahne → PMREM) kullanılır. Üçüncü taraf stok fotoğraf / HDRI URL’lerinden fetch ile doku
çekmek telif ve CORS riski taşıyabilir; bu yüzden eğitim demosunda
kaçınıyoruz.
Split: iki tam küre aynı merkezde, clipping plane ile sol/sağ yarılar — aynı roughness ve albedo, yalnızca metalness farkı. Çizik: siyah = boya (0), beyaz = metal (1). 2×2 ızgara: sabit (m, r) dörtlüsü. Islak vs metal: parlaklık farklı kaynaklardan gelir.
Çizik modunda maske, tek küre üzerinde metalnessMap ile
piksel başına 0→1 geçişi yapar; gradient modları aynı geometride doğrusal
(NoColorSpace) ile yanlış sRGB yüklemenin etkisini
yan yana okumanız için bırakılmıştır — bu ders roughness sayfasındaki
«yanlış sRGB» demosu ile aynı fikri paylaşır, burada maske kanalı
üzerinden tekrarlanır.
Checklist: split modunda sol/sağ yarılar aynı renk ve roughness mu? Çizik modunda parlak çizgiler yalnızca haritada beyaz mı? Izgara hücrelerinde (1, düşük r) ile (0, düşük r) aynı «parlak» değil mi? Islak taşta metalness hâlâ 0 mı?
Aşağıdaki tablo diagram-metalness-demo.js içinde bu demo için
gerçekten kullanılan sabitleri özetler; «öneri» değil, dosyadaki değer
kaydıdır. Tür sütunu: mod radyosu ve roughness kilidi dışındakiler kodda
sabittir (moda göre üretilen mesh parametreleri ayrı satırlarda).
Bu demo’da kontrol edilenler
metalness-demo-mode→ split, ıslak vs metal, ızgara, tam küre, boya, çizik, gradient doğrusal / yanlış sRGBdata-metalness-demo-lock-roughness→ açıkken çoğu moddaroughness0.35(ızgara küreleri hariç)
| Sahne / rol | Parametre | Değer | Tür |
|---|---|---|---|
| Renderer | Temiz renk / ton / kırpma | setClearColor(0x05060c) · ACESFilmicToneMapping ·
exposure 1.02 · SRGBColorSpace çıkış ·
localClippingEnabled = true
|
🔒 Sabit |
| Piksel oranı | Math.min(window.devicePixelRatio || 1, 2) |
🔒 Sabit | |
| RoomEnvironment / PMREM | Başarılı kurulum | PMREMGenerator.fromScene(room, 0.04) · sahne
environment + background ·
environmentIntensity (destek varsa) 1.35
|
🔒 Sabit (kod) |
| Yedek | Hata durumunda arka plan 0x0a0c12 · ek
AmbientLight(0xffffff, 0.2)
|
🔒 Dal (kod) | |
| Işık + çevre katsayısı | DirectionalLight |
Yoğunluk envOk ? 0.22 : 0.5 · konum (2.2, 3.4, 2.6)
|
🔒 Sabit (dal) |
envMapIntensity şablonu |
envI = envOk ? 1.15 : 0 · ızgara hücrelerinde metal için
×1.05, dielektrik için ×0.85 · ıslak küre için
×1.25
|
🔒 Sabit (kod) | |
| Paylaşılan PBR | stdMat tabanı |
color 0xc4cad8 · başlangıç metalness
0 · başlangıç roughness 0.4 ·
envMapIntensity: envI (spread ile ezilir)
|
🔒 Sabit |
| Ortak roughness (kilitsiz) | Çoğu modda roughnessValue(0.38) → 0.38; kilit açıkken
0.35
|
🔄 Kutu (ızgara hariç) | |
| Kamera | PerspectiveCamera |
FOV 38 · clip 0.06–40 · pozisyon
(0, 0.06, 2.62) · lookAt(0, 0, 0)
|
🔒 Sabit |
| Split + tam küre + boya + gradient | SphereGeometry |
Yarıçap 0.52 · segment (56, 36) · split: iki mesh,
clippingPlanes düzlem x ·
clipIntersection: false
|
🔒 Sabit (mod) |
Çizik metalnessMap |
Kanvas | 512 genişlik/yükseklik · siyah zemin · beyaz çizgi
lineWidth 10 · NoColorSpace ·
ClampToEdgeWrapping
|
🔒 Sabit (kod) |
| Gradient haritalar | Kanvas | 256×32 yatay siyah→beyaz · biri NoColorSpace, biri
SRGBColorSpace
|
🔒 Sabit (kod) |
| 2×2 ızgara | Küre + (m, r) | Yarıçap 0.2 segment (32, 22) · dörtlük: (m1 r0.05),
(m1 r0.72), (m0 r0.1), (m0 r0.82) · pozisyonlar (±0.58, 0, ±0.38)
|
🔒 Sabit (mod) |
| Islak vs metal | İki küre | Yarıçap 0.38 segment (44, 30) · sol
metalness 0 renk 0x8a9aad · sağ
metalness 1 renk baseColor · roughness: kilit kapalı
0.1 / 0.32; kilit açık her ikisi 0.35 ·
pozisyon (±0.48, 0, 0)
|
🔄 Kutu + mod |
| HUD | Mod / kilit | metalness-demo-mode ·
data-metalness-demo-lock-roughness
|
🔄 Dinamik (HUD) |
// diagram-metalness-demo.js — özet (mod dalları tabloda)
renderer.setClearColor(0x05060c);
renderer.localClippingEnabled = true;
renderer.outputColorSpace = THREE.SRGBColorSpace;
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 1.02;
// PMREM: const rt = pmrem.fromScene(new RoomEnvironment(), 0.04);
// scene.environment = scene.background = rt.texture; environmentIntensity ≈ 1.35
const baseColor = 0xc4cad8;
const envI = envOk ? 1.15 : 0;
const dir = new THREE.DirectionalLight(0xffffff, envOk ? 0.22 : 0.5);
dir.position.set(2.2, 3.4, 2.6);
const cam = new THREE.PerspectiveCamera(38, aspect, 0.06, 40);
cam.position.set(0, 0.06, 2.62);
cam.lookAt(0, 0, 0);
HoloDepth «Metalness» checkpoint’i
Özet
Metalness, objenize ağırlık ve endüstriyel bir gerçeklik katar; yanlış kullanımı sahneyi «oyun gibi» gösteren en büyük etkenlerden biridir. İyi kalibre edilmiş bir maske, izleyiciye «bu yüzeyin altında ne var?» sorusunun cevabını tek bakışta verir.
HoloDepth özet stratejisi
İkili karar
Bir şey ya metaldir (beyaz) ya değildir (siyah). Ara tonları sadece kir ve aşınma için sakla; geniş gri alanlar genelde maske yerine roughness veya ikinci materyal ihtiyacına işaret eder.
Pas ve kir
Paslanmış bölgeler metal özelliğini kaybeder; paslı kısımları haritada siyaha yakın işle.
Doğrusal kural
NoColorSpace kullanmazsan yansımaların
enerjisi yanlış hesaplanır; şüphede bu sayfadaki gradient · yanlış sRGB modunu referans al.
Albedo uyumu
Metalik bölgelerde albedo’nun yansıma rengine yaklaştığını; dielektriklerde ise kendi rengi olduğunu unutma.
Sonraki durak: geometrik olukları ve gölge «okumasını» güçlendiren Ambient occlusion haritası — metal–rough setinin sık kullanılan tamamlayıcısıdır (yansıma metalinden bağımsız, temas ve kapanım hissini taşır).