Işık ve Renk Uzayı
3D sahnede renk, sadece bir stil tercihi değil; enerji transferi yönetimidir. Web geliştiricilerin alışık olduğu "boyama" mantığı, 3D dünyasında yerini ışık hesaplama disiplinine bırakır.
Renk Uzayı (Color Space) Çıkmazı sRGB vs. Linear
Kritik fikir: Renk değerleri bir "boya" değil, ışık enerjisi taşıyan sayılardır. Bu yüzden doğru sonuç için önce "hangi uzayda hesaplıyorum?" sorusunu sabitlemek gerekir.
Dijital dünyada renkler genelde sRGB formatında saklanır.
Ancak ışık hesaplamaları ( toplama, çarpma, gölgeleme ) sRGB uzayında yapılırsa, sonuçlar fiziksel olarak hatalı çıkar.
sRGB vs. Linear: "Neden Modellerim Soluk?"sRGB (Non-Linear): İnsan gözünün karanlık tonlardaki detayları daha iyi görmesine odaklanan, veriyi sıkıştıran bir formattır.
Bu "sıkıştırma", sayısal değerlerin ışık şiddetiyle doğrusal olmaması demektir.
Yani 0.5 değeri, fiziksel olarak "yarım ışık" anlamına gelmez; göze uygun olacak şekilde eğrilmiş bir ölçektir.
Linear Space: Işığın fiziksel dünyadaki gerçek davranışıdır.
Eğer iki ışık kaynağını topluyorsanız, bu işlem matematiksel olarak sadece Linear uzayda doğru sonuç verir.
Işık toplama, gölgeleme ve PBR gibi hesaplar "enerji korunumuna" yakın durmak ister; bu yüzden işlemler Linear uzayda yapılmalıdır.
Gamma Correction: sRGB verisini işlemek için önce onu "Linear" hale getirir, hesaplamaları yapar, sonra tekrar ekrana basarken "sRGB"ye (Gamma 2.2) geri döneriz.
Three.js’te renderer.outputColorSpace ayarının hayati olmasının sebebi budur.
Pratik kontrol: Işık ekledikçe sahne "grileşiyor/soluyor" ya da parlaklık tutarsızlaşıyorsa, genelde sorun shader’dan önce renk uzayı ve gamma zincirindedir.
Işığın Fiziksel Anatomisi Light Types
Odak: Işık türü seçimi, "hangi ampul daha güzel?" sorusu değil; sahnede hangi parametrelerin sabit hangilerinin mesafeye bağlı ( attenuation/decay gibi ) olacağını belirleyen bir model seçimidir.
3D uzayda ışık, objenin üzerindeki piksellerin rengini belirleyen bir fonksiyonun (\(f\)) girdisidir.
Bu fonksiyonun tipik girdileri; ışığın rengi, şiddeti, yönü, ışık kaynağına olan mesafe ve yüzeyin normal vektörüdür. Çıkış ise tek bir "renk" gibi görünse de, aslında enerji bütçesi hesabının sonucudur.
Işık Türleri ve Fonksiyonel FarklarıAmbient Light (Ortam Işığı): Sahnenin her noktasına eşit vuran, gölgesi olmayan "taban" ışıktır.
Fiziksel bir karşılığı yoktur, sadece karanlık noktaları yok etmek için kullanılır.
Pratik sezgi: Ambient’i "görünürlük açma" aracı gibi düşün.
Çok yükseltirsen kontrast düşer, gölgeler "yıkanır" ve materyal hissi zayıflar.
Directional Light (Yönlü Işık): Bu ışık çeşiti tıpkı Güneş gibi davranır.
Konumu değil, sadece yönü önemlidir, yani ışınlar birbirine paralel gelir.
Bu yüzden Directional, "uzakta ama çok güçlü" kaynakları modellemek için idealdir: mesafe arttıkça şiddeti düşmez.
Gölge istiyorsan genellikle ilk aday budur; çünkü yön sabittir ve sahneye tutarlı bir ışık yönü verir.
Point Light (Nokta Işık): Bir ampul gibidir. Merkezden her yöne dağılır ve mesafeye göre şiddeti azalır ( Decay ).
Point’te kritik kavram attenuation (mesafeyle zayıflama)dır: yakın yüzeyler hızla parlar, uzak yüzeyler hızla söner.
Bu davranış "oda içi lambalar" gibi lokal ışıklar için doğaldır; yanlış ayarda ise sahnede "yakın parlaması / uzakta kararması" abartılı görünür.
Spot Light (Spot Işık): Bir el feneri gibi belirli bir açıyla ( Cone ) yayılır.
Kenar yumuşaklığı ( Penumbra ) gibi optik detaylar barındırır.
Spot, Point’in "yönlü versiyonu" gibidir: hem attenuation/decay vardır, hem de etki bir koni içine kısıtlanır.
Penumbra ile kenarı yumuşatmak, teatral/ürün çekimi tarzı sahnelerde çok işe yarar.
Kısa seçim kuralı: "Global yön ve gölge" istiyorsan Directional, "lokal ampul" istiyorsan Point, "odaklı ışın/konik alan" istiyorsan Spot, sadece taban görünürlük için ölçülü Ambient.
PBR (Physically Based Rendering) Felsefesi Material Model
Odak: PBR, "güzel dursun" diye rastgele ayar çekmek yerine, ışığın yüzeydeki davranışını tahmin edilebilir bir modele bağlar.
Amaç: ışığı değiştirsen de materyalin karakterinin kararlı kalmasıdır.
Modern 3D motorları ve Three.js, ışığı hesaplarken PBR denilen fiziksel tabanlı bir model kullanır.
Burada renk, üç ana bileşenin etkileşimiyle oluşur:
PBR’ı sezgisel okumak için şu ayrımı aklında tut: diffuse ( ışığın yüzey içinde dağılması ) ve specular ( yansıma/parlama ).
"Mat mı parlak mı?" hissi büyük ölçüde bu ikilinin dengesidir; aşağıdaki parametreler bu dengeyi kontrol eder.
PBR ParametreleriAlbedo (Base Color): Objeye beyaz ışık vurduğunda objenin kendi rengi.
Albedo’yu "boya" gibi düşünebilirsin; ama PBR’da kritik nüans şudur: Albedo çoğunlukla diffuse bileşenini besler.
Metal bir yüzeyde ise algıladığın "renk" çoğu zaman diffuse’tan değil, yansımanın renginden gelir.
Roughness (Pürüzlülük): Işığın yüzeyde ne kadar dağılacağı.
Pürüzsüz yüzeyler ışığı tek yöne, pürüzlü yüzeyler her yöne dağıtır.
Roughness arttıkça parlak nokta (highlight) genişler ve yumuşar; yansıma bulanıklaşır.
Roughness azaldıkça yansıma keskinleşir ve yüzey daha cilalı görünür.
Metalness: Malzemenin metal olup olmadığı.
Metaller ışığın çoğunu yansıtırken, dielektrik malzemeler ışığın bir kısmını emer ve içerde dağıtır.
Metalness, "ışık geri mi dönüyor yoksa yüzeyde mi dağılıyor?" sorusunu değiştirir: metal yüzeylerde specular baskındır; dielektrik yüzeylerde diffuse baskındır ve yansıma daha sınırlı görünür.
Pratik sezgi: Bir materyal "plastik gibi" görünüyorsa çoğu zaman sorun albedo değil, roughness/metalness dengesi veya
yetersiz/yanlış ışık kurulumudur.
Önce roughness’ı oturt, sonra metalness’ı belirginleştir.
Işık–Madde Etkileşimi: Normal Vektörleri Dot Product
Odak: Aydınlanma hesaplarının "en küçük birimi", yüzeyin baktığı yön ( Normal ) ile ışığın geliş yönü arasındaki ilişkiyi sayıya dökmektir.
Bu ilişki, çoğu modelde \(N \cdot L\) ile başlar.
Işığın bir yüzeyi ne kadar aydınlatacağını belirleyen en temel matematik Dot Product (Nokta Çarpım) işlemidir.
İki birim vektör için dot product sezgisi şudur: \(N \cdot L = \cos(\theta)\).
\(\theta\) küçüldükçe ( ışık yüzeye daha "dik" geldikçe ) değer 1’e yaklaşır ve yüzey daha aydınlık görünür.
Yüzeyin dik yönü ( Normal ) ile ışığın geliş yönü arasındaki açı ne kadar darsa, yüzey o kadar parlak olur.
Pratikte negatif değerler (ışığın yüzeyin arkasından gelmesi) fiziksel anlam taşımaz; bu yüzden aydınlanma çoğu zaman max(0, \(N \cdot L\)) ile "clamp" edilir.
Açı \(90^{\circ}\) olduğunda aydınlanma sıfıra iner. İşte bu, Vektör Mantığı sayfasında öğrendiğimiz matematiğin görsel karşılığıdır.
Neden normal map işe yarar? Geometriyi değiştirmeden, her pikselde kullanılan Normal yönünü değiştirir.
Böylece \(N \cdot L\) farklı çıkar ve yüzey "detaylı kabartma" gibi ışığı kırıyormuş hissi verir.
Işığın enerjisini simüle et
Teoride kalan sRGB vs Linear farkını canlı bir sahnede test edin. PBR materyallerin ışık altındaki Metalness/Roughness tepkilerini manipüle ederek gerçekçiliğin matematiğini kavrayın.
Gamma correction ve PBR parametrelerini (roughness/metalness) tek sahnede değiştirerek, "neden soluk?" sorusunu gözle çöz.