Teori

PBR veya daha yaygın olarak physically based rendering (tr. fiziksel temelli sahneleme) olarak bilinen, fiziksel dünyayla daha yakından eşleşen aynı temel teoriye dayanan bir rendering teknikleri birleşimidir. PBR, ışığı fiziksel olarak makul bir şekilde taklit etmeyi amaçladığından, Phong ve Blinn-Phong gibi orijinal aydınlatma algoritmalarımıza kıyasla genellikle daha gerçekçi görünür. Gerçek fiziğe çok yakın olduğu için sadece daha iyi görünmekle kalmaz, biz (ve özellikle sanatçılar) aydınlatmanın doğru görünmesini sağlamak için ucuz hilelere ve ince ayarlara başvurmak zorunda kalmadan fiziksel parametrelere dayalı yüzey materyalleri yazabiliyoruz. Fiziksel parametrelere dayalı materyal yazmanın en büyük avantajlarından biri, bu materyallerin aydınlatma koşullarından bağımsız olarak doğru görünecek olmasıdır; PBR olmayan iş hatlarında doğru olmayan bir şeydir.

PBR yine de gerçekliğin bir yaklaşımıdır (fizik ilkelerine dayalıdır), bu nedenle buna fiziksel gölgeleme değil, fiziksel temelli gölgeleme denmesinin nedeni budur. Bir PBR aydınlatma modelinin fiziksel olarak kabul edilebilmesi için aşağıdaki 3 koşulu karşılaması gerekir (endişelenmeyin, onlara çok yakında ulaşacağız):

  1. Mikro yüzey yüzey modelini temel alın.

  2. Enerji tasarrufu sağlayın

  3. Fiziksel temelli bir BRDF kullanın

Sonraki PBR bölümlerinde, orijinal olarak Disney tarafından keşfedildiği ve Epic Games tarafından gerçek zamanlı gösterim için benimsendiği şekliyle PBR yaklaşımına odaklanacağız. Metalik iş akışına dayanan yaklaşımları, düzgün bir şekilde belgelenmiştir, çoğu popüler motorda yaygın olarak benimsenmiştir ve görsel olarak harika görünmektedir. Bu bölümlerin sonunda şuna benzeyen bir şeye sahip olacağız:

Bu bölümlerdeki konuların oldukça ileri düzeyde olduğunu unutmayın, bu nedenle OpenGL ve shader aydınlatma hakkında iyi bir bilgiye sahip olmanız önerilir. Bu seri için ihtiyaç duyacağınız daha gelişmiş bilgilerden bazıları şunlardır: framebuffer, küp eşleme, gama düzeltmesi, HDR ve normal eşleme. Ayrıca bazı ileri matematik konularına da gireceğiz, ancak kavramları olabildiğince açık bir şekilde açıklamak için elimden gelenin en iyisini yapacağım.

Mikro yüzey modeli

Tüm PBR teknikleri, mikro yüzeyler teorisine dayanmaktadır. Teori, mikroskobik ölçekteki herhangi bir yüzeyin, mikro yüzey adı verilen küçük, mükemmel yansıtıcı aynalarla tanımlanabileceğini açıklar. Bir yüzeyin pürüzlülüğüne bağlı olarak, bu küçük aynaların hizalanması oldukça farklı olabilir:

Bir yüzey ne kadar pürüzlüyse, her bir mikro yüzey yüzey boyunca o kadar düzensiz bir şekilde hizalanır. Bu küçücük ayna hizalamalarının etkisi, özellikle aynasal aydınlatma/yansıma hakkında konuşurken, gelen ışık ışınlarının daha pürüzlü yüzeyler üzerinde tamamen farklı yönler boyunca dağılma olasılığının daha yüksek olması ve daha yaygın bir aynasal yansıma ile sonuçlanmasıdır. Buna karşılık, pürüzsüz bir yüzeyde ışık ışınlarının kabaca aynı yönde yansıması daha olasıdır, bu da bize daha küçük ve daha keskin yansımalar sağlar:

Mikroskobik düzeyde hiçbir yüzey tamamen pürüzsüz değildir, ancak bu mikro yüzeyler, aralarında piksel bazında bir ayrım yapamayacak kadar küçük olduğundan, bir pürüzlülük parametresi verilen yüzeyin mikro yüzey pürüzlülüğünü istatistiksel olarak yaklaşık olarak hesaplarız. Bir yüzeyin pürüzlülüğüne dayanarak, bir h vektörüne kabaca hizalanmış mikro yüzeylerin oranını hesaplayabiliriz. Bu h vektörü, ışık l ve görünüm v vektörü arasında yer alan yarı yol vektörüdür. Daha önce l ve v'nin toplamının uzunluğuna bölünmesiyle hesaplanan gelişmiş aydınlatma bölümünde yarı yol vektörünü tartışmıştık:

Mikro yüzeyler yarım vektöre ne kadar hizalanırsa, aynasal yansıma o kadar keskin ve güçlü olur. 0 ile 1 arasında değişen bir pürüzlülük parametresiyle birlikte, mikro yüzeylerin hizalamasını istatistiksel olarak yaklaşık olarak tahmin edebiliriz:

Daha yüksek pürüzlülük değerlerinin, pürüzsüz yüzeylerin daha küçük ve daha keskin aynasal yansıma şeklinin aksine, çok daha büyük bir aynasal yansıma şekli gösterdiğini görebiliriz.

Enerji korunumu

Mikro yüzey yaklaşımı bir tür enerji korunumu kullanır: giden ışık enerjisi asla gelen ışık enerjisini geçmemelidir (yayıcı yüzeyler hariç). Yukarıdaki resme baktığımızda, speküler yansıma alanının arttığını, ancak artan pürüzlülük seviyelerinde parlaklığının azaldığını görüyoruz. Aynasal yoğunluk her pikselde aynı olsaydı (speküler şeklin boyutundan bağımsız olarak), daha pürüzlü yüzeyler çok daha fazla enerji yayar ve bu da enerjinin korunumu ilkesini ihlal eder. Bu nedenle aynasal yansımaları pürüzsüz yüzeylerde daha yoğun, pürüzlü yüzeylerde ise daha loş görüyoruz.

Enerji korunumunun geçerli olması için, dağınık ve speküler ışık arasında net bir ayrım yapmamız gerekir. Bir ışık ışını bir yüzeye çarptığı anda hem kırılma hem de yansıma bölümünde bölünür. Yansıma kısmı, doğrudan yansıyan ve yüzeye girmeyen ışıktır; aynasal aydınlatma olarak bildiğimiz şey budur. Kırılma kısmı, yüzeye giren ve emilen kalan ışıktır; dağınık aydınlatma olarak bildiğimiz şey budur.

Burada bazı nüanslar vardır, çünkü kırılan ışık yüzeye dokunduğunda hemen emilmez. Fizikten, ışığın tüm enerjisini kaybedene kadar ilerlemeye devam eden bir enerji ışını olarak modellenebileceğini biliyoruz; bir ışık huzmesinin enerji kaybetme şekli çarpışmadır. Her malzeme, aşağıdaki resimde gösterildiği gibi ışık ışını ile çarpışabilen küçük parçacıklardan oluşur. Parçacıklar, ısıya dönüştürülen her çarpışmada ışığın enerjisinin bir kısmını veya tamamını emer.

Genel olarak, tüm enerji emilmez ve ışık (çoğunlukla) rastgele bir yönde saçılmaya devam eder ve bu noktada enerjisi tükenene veya yüzeyi tekrar terk edene kadar diğer parçacıklarla çarpışır. Yüzeyden yeniden çıkan ışık ışınları, yüzeyin gözlenen (yaygın) rengine katkıda bulunur. Bununla birlikte, fiziksel tabanlı işlemede, kırılan tüm ışığın çok küçük bir etki alanında emildiği ve dağıldığı ve yüzeyden belli bir mesafeden çıkmış olabilecek saçılmış ışık ışınlarının etkisini göz ardı ederek basitleştirici bir varsayımda bulunuyoruz. Bunu hesaba katan özel gölgelendirici teknikleri, cilt, mermer veya balmumu gibi malzemelerde görsel kaliteyi önemli ölçüde artıran, ancak performans pahasına gelen yüzey altı saçılma teknikleri olarak bilinir.

Yansıma ve kırılma söz konusu olduğunda ek bir incelik, metalik yüzeylerdir. Metalik yüzeyler, metalik olmayan yüzeylere (dielektrik olarak da bilinir) kıyasla ışığa farklı tepki verir. Metalik yüzeyler aynı yansıma ve kırılma ilkelerini takip eder, ancak kırılan tüm ışık saçılmadan doğrudan emilir. Bu, metalik yüzeylerin yalnızca yansıyan veya aynasal ışık bıraktığı anlamına gelir; metalik yüzeyler dağınık renkler göstermez. Metaller ve dielektrikler arasındaki bu belirgin ayrım nedeniyle, her ikisi de, bölümün ilerleyen kısımlarında inceleyeceğimiz PBR boru hattında farklı şekilde ele alınır.

Yansıyan ve kırılan ışık arasındaki bu ayrım, bizi enerjinin korunmasıyla ilgili başka bir gözleme götürür: bunlar birbirini dışlar. Yansıtılan ışık enerjisi ne olursa olsun, artık malzemenin kendisi tarafından emilmeyecektir. Böylece, kırılan ışık olarak yüzeye girmeye bırakılan enerji, yansımayı hesaba kattıktan sonra doğrudan ortaya çıkan enerjidir.

Bu enerji tasarrufu ilişkisini, önce gelen ışığın enerjisinin yansıtıldığı yüzdeyi oluşturan aynasal kesri hesaplayarak koruyoruz. Kırılan ışığın fraksiyonu daha sonra doğrudan speküler fraksiyondan şu şekilde hesaplanır:

float kS = calculateSpecularComponent(...); // reflection/specular fraction
float kD = 1.0 - kS;                        // refraction/diffuse  fraction

Bu sayede enerji tasarrufu ilkesine bağlı kalarak hem gelen ışığın yansıttığı miktarı hem de gelen ışığın kırdığı miktarı biliyoruz. Bu yaklaşım göz önüne alındığında, hem kırılan/yayılan hem de yansıyan/speküler katkının 1.0'ı aşması imkansızdır, böylece enerjilerinin toplamının asla gelen ışık enerjisini aşmaması sağlanır. Önceki aydınlatma bölümlerinde hesaba katmadığımız bir şey.

Yansıtıcılık denklemi

Bu bizi render denklemi denen bir şeye getiriyor, çok zeki bazı insanların bulduğu ayrıntılı bir denklem, şu anda ışığın görsellerini simüle etmek için elimizdeki en iyi model. Fiziksel tabanlı işleme, yansıtma denklemi olarak bilinen işleme denkleminin daha özel bir versiyonunu güçlü bir şekilde takip eder. PBR'yi doğru bir şekilde anlamak için, öncelikle yansıma denklemini sağlam bir şekilde anlamak önemlidir:

Yansıtma denklemi ilk başta göz korkutucu görünüyor, ancak inceleyeceğimiz gibi, yavaş yavaş mantıklı olmaya başladığını göreceksiniz. Denklemi anlamak için biraz radyometriye dalmalıyız. Radyometri, görünür ışık da dahil olmak üzere elektromanyetik radyasyonun ölçümüdür. Yüzeyler ve yönler üzerinde ışığı ölçmek için kullanabileceğimiz birkaç radyometrik büyüklük vardır, ancak burada L olarak gösterilen, parlaklık olarak bilinen yansıtma denklemiyle ilgili yalnızca bir tanesini tartışacağız. Işığın büyüklüğünü veya gücünü ölçmek için Parlaklık kullanılır tek yönden geliyor. Parlaklık birden çok fiziksel niceliğin birleşimi olduğundan, ilk başta anlamak biraz zor, bu nedenle önce bunlara odaklanacağız:

Işınım akısı: ışıma akısı Φ, Watt cinsinden ölçülen bir ışık kaynağının iletilen enerjisidir. Işık, her dalga boyu belirli (görünür) bir renkle ilişkilendirilen, birden çok farklı dalga boyundaki enerjinin toplu toplamıdır. Bir ışık kaynağının yayılan enerjisi, bu nedenle, tüm farklı dalga boylarının bir fonksiyonu olarak düşünülebilir. 390nm ila 700nm (nanometre) arasındaki dalga boyları, görünür ışık spektrumunun bir parçası olarak kabul edilir, yani insan gözünün algılayabildiği dalga boyları. Aşağıda, gün ışığının dalga boyu başına farklı enerjilerin bir görüntüsünü bulacaksınız:

Işınım akısı, farklı dalga boylarındaki bu fonksiyonun toplam alanını ölçer. Bu dalga boyları ölçüsünü doğrudan girdi olarak almak biraz pratik değildir, bu nedenle genellikle radyant akıyı temsil etmeyi basitleştirmeyi, değişen dalga boyu güçlerinin bir fonksiyonu olarak değil, RGB olarak kodlanmış bir açık renk üçlüsü olarak yaparız (veya genel olarak adlandırdığımız gibi: açık renk). Bu kodlama oldukça bilgi kaybına neden olur, ancak bu genellikle görsel yönler için ihmal edilebilir.

Katı açı: ω ile gösterilen katı açı, bize bir birim küre üzerine yansıtılan bir şeklin boyutunu veya alanını söyler. Bu birim küre üzerine yansıtılan şeklin alanı katı açı olarak bilinir; katı açıyı hacimle bir yön olarak görselleştirebilirsiniz:

Bu birim kürenin merkezinde bir gözlemci olduğunuzu ve şeklin yönüne baktığınızı düşünün; Yaptığınız siluetin boyutu katı açıdır.

Işınım yoğunluğu: ışıma yoğunluğu, katı açı başına ışıma akısının miktarını veya birim küre üzerine yansıtılan bir alan üzerindeki bir ışık kaynağının gücünü ölçer. Örneğin, her yöne eşit olarak yayılan çok yönlü bir ışık verildiğinde, ışıma yoğunluğu bize enerjisini belirli bir alan (düz açı) üzerinde verebilir:

Işınım yoğunluğunu tanımlayan denklem aşağıdaki gibi tanımlanır:

I, katı açı ω üzerindeki radyan akı Φ olduğunda.

Işınım akısı, ışıma yoğunluğu ve katı açı bilgisi ile nihayet ışıma denklemini tanımlayabiliriz. Parlaklık, radyan yoğunluğu Φ olan bir ışığın katı açısı ω üzerinde bir A alanında gözlemlenen toplam enerji olarak tanımlanır:

Işıltı, bir alandaki ışık miktarının radyometrik bir ölçüsüdür ve ışığın cosθ olarak yüzeyin normaline gelen (veya gelen) açısına θ göre ölçeklenir: ışık, yüzeye doğrudan ne kadar az ışırsa o kadar zayıf ve ışık yayıldığında en güçlüsüdür. yüzeye doğrudan diktir. Bu, temel aydınlatma bölümündeki dağınık aydınlatma algımıza benzer, çünkü cosθ doğrudan ışığın yön vektörü ile yüzey normali arasındaki nokta çarpımına karşılık gelir:

float cosTheta = dot(lightDir, N);  

Parlaklık denklemi, ilgilendiğimiz çoğu fiziksel niceliği içerdiğinden oldukça kullanışlıdır. Katı açı ω ve A alanının sonsuz küçük olduğunu düşünürsek, bir cisme çarpan tek bir ışık ışınının akısını ölçmek için ışımayı kullanabiliriz. uzayda tek nokta. Bu bağıntı, tek bir (parça) noktayı etkileyen tek bir ışık ışınının parlaklığını hesaplamamızı sağlar; katı açıyı ω bir yön vektörüne ω ve A'yı bir p noktasına etkin bir şekilde çeviririz. Bu şekilde, tek bir ışık ışınının parça başına katkısını hesaplamak için gölgelendiricilerimizde parlaklığı doğrudan kullanabiliriz.

Aslında, parlaklık söz konusu olduğunda, genel olarak, ışık olarak bilinen tüm parlaklığın toplamı olan bir p noktasına gelen tüm ışıkla ilgileniriz. Hem parlaklık hem de ışınım bilgisi ile yansıma denklemine geri dönebiliriz:

Artık render denklemindeki L'nin bir p noktasının ve gelen bir yön vektörü ωi olarak düşünülebilecek bazı gelen sonsuz küçük katı ωi açısının parlaklığını temsil ettiğini biliyoruz. cosθ'nin, yansıma denkleminde n⋅ωi olarak bulduğumuz, ışığın yüzeye geliş açısına dayalı olarak enerjiyi ölçeklediğini unutmayın. Yansıma denklemi, izleyiciye giden yön olan ωo yönünde bir p noktasının yansıtılan parlaklığının Lo(p,ωo) toplamını hesaplar. Veya başka bir şekilde ifade etmek gerekirse: Lo, ωo'dan bakıldığında ışıkların p noktasına yansıyan toplamını ölçer.

Yansıma denklemi, ışığını ölçtüğümüz tüm gelen ışımanın toplamı olan ışıma etrafında kuruludur. Sadece tek bir gelen ışık yönünden değil, p noktası etrafında ortalanmış bir yarım küre içindeki tüm gelen ışık yönleri için. Bir yarım küre, bir yüzeyin normal n etrafında hizalanmış yarım küre olarak tanımlanabilir:

Bir alan veya (bir yarım küre durumunda) bir hacim içindeki değerlerin toplamını hesaplamak için, yarım küre Ω içindeki tüm gelen yönler dωi üzerinde yansıma denkleminde ∫ olarak gösterilen integral adı verilen matematiksel bir yapı kullanırız. İntegral, analitik veya sayısal olarak hesaplanabilen bir fonksiyonun alanını ölçer. Hem oluşturma hem de yansıtma denkleminin analitik bir çözümü olmadığından, integrali ayrık olarak sayısal olarak çözmek isteyeceğiz. Bu, yarım küre Ω üzerinde yansıma denkleminin küçük ayrık adımlarının sonucunun alınması ve sonuçlarının adım boyutu üzerinden ortalamasının alınması anlamına gelir. Bu, kabaca aşağıdaki gibi kodda görselleştirebileceğimiz Riemann toplamı olarak bilinir:

int steps = 100;
float sum = 0.0f;
vec3 P    = ...;
vec3 Wo   = ...;
vec3 N    = ...;
float dW  = 1.0f / steps;
for(int i = 0; i < steps; ++i) 
{
    vec3 Wi = getNextIncomingLightDir(i);
    sum += Fr(P, Wi, Wo) * L(P, Wi) * dot(N, Wi) * dW;
}

Adımları dW ile ölçeklendirerek toplam, integral fonksiyonunun toplam alanına veya hacmine eşit olacaktır. Her bir ayrı adımı ölçeklendirmek için kullanılan dW, yansıtma denkleminde dωi olarak düşünülebilir. Matematiksel olarak dωi, integrali hesapladığımız sürekli semboldür ve koddaki dW ile doğrudan ilişkili olmasa da (bu, Riemann toplamının ayrı bir adımı olduğundan), bu şekilde düşünmeye yardımcı olur. Ayrık adımlar atmanın bize her zaman fonksiyonun toplam alanı için bir yaklaşıklık vereceğini unutmayın. Dikkatli bir okuyucu, adım sayısını artırarak Riemann Toplamının doğruluğunu artırabileceğimizi fark edecektir.

Yansıtma denklemi, p isabet noktası olan fr tarafından ölçeklenen yarımküre Ω üzerindeki tüm gelen ışık yönlerinin ωi parlaklığını toplar ve izleyicinin yönünde yansıyan ışığın toplamını Lo verir. Gelen parlaklık, aşina olduğumuz ışık kaynaklarından veya IBL bölümlerinde tartışacağımız gibi, gelen her yönün parlaklığını ölçen bir ortam haritasından gelebilir.

Şimdi geriye kalan tek bilinmeyen, BRDF olarak bilinen fr sembolü veya yüzeyin malzeme özelliklerine göre gelen parlaklığı ölçekleyen veya tartan çift yönlü yansıtıcı dağılım işlevidir.

BRDF

BRDF veya çift yönlü yansıtıcı dağılım işlevi, giriş (ışık) yönü ωi, giden (görünüm) yönü ωo, yüzey normali n ve mikro yüzeyin pürüzlülüğünü temsil eden bir yüzey parametresi a alan bir işlevdir. BRDF, malzeme özellikleri göz önüne alındığında, opak bir yüzeyin son yansıyan ışığına her bir ışık ışını ωi'nin ne kadar katkıda bulunduğunu tahmin eder. Örneğin, yüzey mükemmel bir şekilde pürüzsüz bir yüzeye sahipse (~bir ayna gibi), BRDF işlevi, giden ışın ωo ile aynı (yansıyan) açıya sahip olan bir ışın dışında gelen tüm ışık ışınları ωi için 0.0 döndürür. 1.0 döndürür.

Bir BRDF, daha önce tartışılan mikro yüzey teorisine dayalı olarak malzemenin yansıtıcı ve kırılma özelliklerine yaklaşır. Bir BRDF'nin fiziksel olarak makul olması için enerjinin korunumu yasasına uyması gerekir, yani yansıyan ışığın toplamı asla gelen ışığın miktarını geçmemelidir. Teknik olarak, Blinn-Phong, girdi olarak aynı ωi ve ωo'yu alan bir BRDF olarak kabul edilir. Ancak, Blinn-Phong, enerji tasarrufu ilkesine bağlı olmadığı için fiziksel temelli olarak kabul edilmez. Yüzeyin ışığa tepkisini tahmin etmek için fiziksel tabanlı birkaç BRDF var. Ancak, neredeyse tüm gerçek zamanlı PBR işleme hatları, Cook-Torrance BRDF olarak bilinen bir BRDF kullanır.

Cook-Torrance BRDF, hem dağınık hem de aynasal bir parça içerir:

Burada kd, daha önce bahsedilen, gelen ışık enerjisinin kırılan oranıdır ve ks, yansıtılan orandır. BRDF'nin sol tarafı, denklemin burada flambert olarak gösterilen dağınık kısmını belirtir. Bu, dağınık gölgeleme için kullandığımıza benzer şekilde Lambert dağınıklığı olarak bilinir ve bu sabit bir faktör olarak ifade edilir:

c albedo veya yüzey rengi olmak üzere (yaygın yüzey dokusunu düşünün). Pi ile bölme, BRDF'yi içeren daha önce belirtilen integral π ile ölçeklendiğinden, dağınık ışığı normalleştirmek için vardır (bunu IBL bölümlerinde ele alacağız).

Bu Lambert yayılımının daha önce kullandığımız dağınık aydınlatmayla nasıl bir ilişkisi olduğunu merak edebilirsiniz: yüzey renginin yüzeyin normali ile ışık yönü arasındaki nokta çarpımı ile çarpımı. Nokta çarpım hala oradadır, ancak Lo integralinin sonunda n⋅ωi'yi bulduğumuz için BRDF'nin dışına çıkmıştır.

BRDF'nin dağınık kısmı için daha gerçekçi görünme eğiliminde olan, ancak aynı zamanda hesaplama açısından daha pahalı olan farklı denklemler bulunmaktadır. Ancak Epic Games tarafından sonuca varıldığı gibi, Lambertian yayılımı çoğu gerçek zamanlı işleme amacı için yeterlidir.

BRDF'nin aynasal kısmı biraz daha gelişmiştir ve şu şekilde tanımlanır:

Cook-Torrance aynasal BRDF, üç fonksiyondan ve paydada bir normalleştirme faktöründen oluşur. D, F ve G sembollerinin her biri, yüzeyin yansıtıcı özelliklerinin belirli bir kısmına yaklaşan bir fonksiyon tipini temsil eder. Bunlar normal Dağılım fonksiyonu, Fresnel denklemi ve Geometri fonksiyonu olarak tanımlanır:

Normal dağılım işlevi: yüzeyin pürüzlülüğünden etkilenen yüzeyin mikro yüzeylerinin yarı yol vektörüne hizalanma miktarını yaklaşık olarak verir; bu, mikro yönlere yaklaşan birincil işlevdir. Geometri işlevi: mikro yüzeylerin kendi kendini gölgeleme özelliğini tanımlar. Bir yüzey nispeten pürüzlü olduğunda, yüzeyin mikro yüzeyleri, yüzeyin yansıttığı ışığı azaltan diğer mikro yüzeyleri gölgede bırakabilir. Fresnel denklemi: Fresnel denklemi, farklı yüzey açılarında yüzey yansıma oranını tanımlar. Bu fonksiyonların her biri, fizik eşdeğerlerinin bir tahminidir ve her birinin altında yatan fiziğe farklı şekillerde yaklaşmayı amaçlayan birden fazla versiyonunu bulacaksınız; bazıları daha gerçekçi, bazıları daha verimli. Kullanmak istediğiniz bu işlevlerin yaklaşık sürümünü seçmeniz gayet iyi. Epic Games'ten Brian Karis, buradaki çoklu yaklaşım türleri hakkında çok fazla araştırma yaptı. D için Trowbridge-Reitz GGX, F için Fresnel-Schlick yaklaşımı ve G için Smith'in Schlick-GGX'i olan Epic Game'in Unreal Engine 4'ü tarafından kullanılan aynı işlevleri seçeceğiz.

Normal Dağılım İşlevi

Normal dağılım işlevi D, (yarım) vektör h ile tam olarak hizalanmış mikro yüzeylerin nispi yüzey alanına istatistiksel olarak yaklaşır. Bazı pürüzlülük parametreleri verilen mikro yüzeylerin genel hizalamasına istatistiksel olarak yaklaşan çok sayıda NDF vardır ve kullanacağımız, Trowbridge-Reitz GGX olarak bilinir:

Burada h, yüzeyin pürüzlülüğünün bir ölçüsü olmak üzere, yüzeyin mikro yüzeylerine karşı ölçülecek yarı yol vektörüdür. h'yi değişen pürüzlülük parametreleri üzerinden yüzey normali ile ışık yönü arasındaki yarı yol vektörü olarak alırsak aşağıdaki görsel sonucu elde ederiz:

Pürüzlülük düşük olduğunda (dolayısıyla yüzey pürüzsüzdür), yüksek düzeyde konsantre sayıda mikro yüzey, küçük bir yarıçap üzerinde yarı yol vektörlerine hizalanır. Bu yüksek konsantrasyon nedeniyle, NDF çok parlak bir nokta gösterir. Bununla birlikte, mikro yüzeylerin çok daha rastgele yönlerde hizalandığı pürüzlü bir yüzeyde, bize daha grimsi sonuçlar veren çok daha fazla sayıda yarım vektör h bulacaksınız.

GLSL'de Trowbridge-Reitz GGX normal dağılım işlevi aşağıdaki koda çevrilir:

float DistributionGGX(vec3 N, vec3 H, float a)
{
    float a2     = a*a;
    float NdotH  = max(dot(N, H), 0.0);
    float NdotH2 = NdotH*NdotH;
	
    float nom    = a2;
    float denom  = (NdotH2 * (a2 - 1.0) + 1.0);
    denom        = PI * denom * denom;
	
    return nom / denom;
}

Geometri işlevi

Geometri işlevi, mikro yüzey ayrıntılarının birbirini gölgelediği ve ışık ışınlarının tıkanmasına neden olduğu göreceli yüzey alanına istatistiksel olarak yaklaşır.

NDF'ye benzer şekilde geometri işlevi, mikro yüzeyleri gölgeleme olasılığı daha yüksek olan daha pürüzlü yüzeylerle girdi olarak bir malzemenin pürüzlülük parametresini alır. Kullanacağımız geometri işlevi, Schlick-GGX olarak bilinen GGX ve Schlick-Beckmann yaklaşımının bir birleşimidir:

Burada k, geometri işlevini doğrudan aydınlatma veya IBL aydınlatma için kullanıp kullanmamamıza bağlı olarak α'nın yeniden eşlemesidir:

α değerinin motorunuzun pürüzlülüğü α'ya nasıl çevirdiğine bağlı olarak değişebileceğini unutmayın. Sonraki bölümlerde, bu yeniden eşlemenin nasıl ve nerede alakalı hale geldiğini kapsamlı bir şekilde tartışacağız.

Geometriye etkili bir şekilde yaklaşmak için hem görüş yönünü (geometri engeli) hem de ışık yönü vektörünü (geometri gölgelemesi) hesaba katmamız gerekir. Her ikisini de Smith'in yöntemini kullanarak dikkate alabiliriz:

Smith'in yöntemini Schlick-GGX ile Gsub olarak kullanmak, değişen pürüzlülük R üzerinde aşağıdaki görsel görünümü verir:

Geometri işlevi, mikro yüzey gölgelemeyi ölçmeyen 1.0 (veya beyaz) ve 0.0 (veya siyah) tam mikro yüzey gölgelemesi ile [0.0, 1.0] arasında bir çarpandır.

GLSL'de geometri işlevi aşağıdaki koda çevrilir:

float GeometrySchlickGGX(float NdotV, float k)
{
    float nom   = NdotV;
    float denom = NdotV * (1.0 - k) + k;
	
    return nom / denom;
}
  
float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
{
    float NdotV = max(dot(N, V), 0.0);
    float NdotL = max(dot(N, L), 0.0);
    float ggx1 = GeometrySchlickGGX(NdotV, k);
    float ggx2 = GeometrySchlickGGX(NdotL, k);
	
    return ggx1 * ggx2;
}

Fresnel Denklemi

Fresnel denklemi (Freh-nel olarak telaffuz edilir), bir yüzeye baktığımız açıya göre değişen, kırılan ışık üzerinden yansıyan ışığın oranını tanımlar. Işık bir yüzeye çarptığı anda, yüzeyden görüş açısına bağlı olarak, Fresnel denklemi bize yansıyan ışığın yüzdesini söyler. Bu yansıma oranından ve enerji korunumu ilkesinden ışığın kırılan kısmını doğrudan elde edebiliriz.

Her yüzey veya malzeme, yüzeyine doğrudan bakıldığında bir taban yansıtma düzeyine sahiptir, ancak yüzeye bir açıdan bakıldığında tüm yansımalar, yüzeyin taban yansıtma özelliğine kıyasla daha belirgin hale gelir. Bunu, belirli bir taban yansıtma düzeyine sahip (muhtemelen) ahşap/metalik masanıza dik bir açıdan bakarak kendiniz kontrol edebilirsiniz, ancak masanıza neredeyse 90 derecelik bir açıdan baktığınızda yansımaların nasıl göründüğünü göreceksiniz. çok daha belirgin. Mükemmel 90 derecelik açılardan bakıldığında tüm yüzeyler teorik olarak ışığı tamamen yansıtır. Bu fenomen Fresnel olarak bilinir ve Fresnel denklemi ile tanımlanır.

Fresnel denklemi oldukça karmaşık bir denklemdir, ancak neyse ki Fresnel denklemi, Fresnel-Schlick yaklaşımı kullanılarak yaklaşık olarak hesaplanabilir:

F0, kırılma indeksleri veya IOR olarak adlandırılan bir şey kullanarak hesapladığımız yüzeyin temel yansıtıcılığını temsil eder. Bir küre yüzeyinde görebileceğiniz gibi, yüzeyin otlatma açılarına ne kadar çok bakarsak (yarı görüş açısı 90 dereceye ulaşırsa), Fresnel ve dolayısıyla yansımalar o kadar güçlü olur:

Fresnel denklemiyle ilgili birkaç incelik vardır. Birincisi, Fresnel-Schlick yaklaşımının yalnızca dielektrik veya metal olmayan yüzeyler için gerçekten tanımlanmış olmasıdır. İletken yüzeyleri (metaller) için, kırılma indisleri ile taban yansıtıcılığını hesaplamak doğru şekilde yapılmaz ve iletkenler için tamamen farklı bir Fresnel denklemi kullanmamız gerekir. Bu elverişsiz olduğundan, yüzeyin tepkisini normal gelişte (F0) 0 derecelik bir açıyla doğrudan bir yüzeye bakıyormuş gibi önceden hesaplayarak daha da yaklaştırıyoruz. Bu değeri, Fresnel-Schlick yaklaşımına göre görüş açısına göre enterpolasyon yaparız, böylece aynı denklemi hem metaller hem de metal olmayanlar için kullanabiliriz.

Yüzeyin normal insidansta tepkisi veya taban yansıtması, Naty Hoffman'ın ders notlarından alınan aşağıda listelenen daha yaygın değerlerden bazıları ile bunun gibi büyük veritabanlarında bulunabilir:

Burada gözlemlenmesi ilginç olan şey, tüm dielektrik yüzeyler için taban yansıtmasının hiçbir zaman 0,17'nin üzerine çıkmamasıdır ki bu kuraldan ziyade bir istisnadır; iletkenler için taban yansıtması çok daha yüksek başlar ve (çoğunlukla) 0,5 ile 1,0 arasında değişir. Ayrıca, iletkenler (veya metalik yüzeyler) için taban yansıtması renklendirilir. F0'ın bir RGB üçlüsü olarak sunulmasının nedeni budur (normal insidansta yansıma, dalga boyuna göre değişebilir); bu sadece metalik yüzeylerde gördüğümüz bir şey.

Dielektrik yüzeylere kıyasla metalik yüzeylerin bu özel nitelikleri, metalik iş akışı adı verilen bir şeye yol açtı. Metalik iş akışında, bir yüzeyin metalik mi yoksa metalik olmayan bir yüzey mi olduğunu tanımlayan, metallik olarak bilinen ekstra bir parametreyle yüzey malzemeleri yazıyoruz.

Teorik olarak, bir malzemenin metalliği ikilidir: ya bir metaldir ya da değildir; ikisi birden olamaz. Bununla birlikte, çoğu işleme boru hattı, bir yüzeyin metalliğini 0,0 ile 1,0 arasında doğrusal olarak yapılandırmaya izin verir. Bunun nedeni çoğunlukla malzeme dokusu hassasiyetinin olmamasıdır. Örneğin, metalik bir yüzey üzerinde küçük (metal olmayan) toz/kum benzeri parçacıklar/çizikler içeren bir yüzeyin ikili metallik değerleriyle işlenmesi zordur.

Hem dielektrikler hem de iletkenler için F0'ı önceden hesaplayarak, her iki yüzey türü için de aynı Fresnel-Schlick yaklaşımını kullanabiliriz, ancak metalik bir yüzeye sahipsek taban yansıtmasını renklendirmemiz gerekir. Bunu genel olarak şu şekilde gerçekleştiriyoruz:

vec3 F0 = vec3(0.04);
F0      = mix(F0, surfaceColor.rgb, metalness);

Çoğu dielektrik yüzey için yaklaşık bir temel yansıtma tanımlarız. Bu, F0'ın en yaygın dielektrikler etrafında ortalaması alındığından başka bir yaklaşımdır. 0,04'lük bir baz yansıtıcılığı çoğu dielektrik için geçerlidir ve ek bir yüzey parametresi yazmak zorunda kalmadan fiziksel olarak makul sonuçlar üretir. Daha sonra, bir yüzeyin ne kadar metalik olduğuna bağlı olarak, ya dielektrik taban yansıtıcılığını alırız ya da yüzey rengi olarak F0 yazılır. Metalik yüzeyler tüm kırılan ışığı emdiği için dağınık yansımaları yoktur ve yüzey renk dokusunu temel yansıtıcılık olarak doğrudan kullanabiliriz.

Kodda, Fresnel Schlick yaklaşımı şu anlama gelir:

vec3 fresnelSchlick(float cosTheta, vec3 F0)
{
    return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
}

cosTheta, yüzeyin normal n ile yarım h (veya görünüm v) yönü arasındaki nokta çarpımıdır.

Cook-Torrance yansıma denklemi

Cook-Torrance BRDF'nin açıklanan her bileşeniyle, fiziksel tabanlı BRDF'yi şimdiki nihai yansıtma denklemine dahil edebiliriz:

Ancak bu denklem tamamen matematiksel olarak doğru değildir. Fresnel terimi F'nin bir yüzeye yansıyan ışığın oranını temsil ettiğini hatırlayabilirsiniz. Bu bizim ks oranımızdır, yani yansıma denkleminin aynasal (BRDF) kısmı dolaylı olarak yansıma oranını ks içerir. Buna göre, son yansıma denklemimiz şu hale gelir:

Bu denklem şimdi, genellikle fiziksel tabanlı oluşturma veya PBR olarak anladığımız şey olarak kabul edilen fiziksel tabanlı bir oluşturma modelini tamamen tanımlamaktadır. Tartışılan tüm matematiği kodda nasıl bir araya getirmemiz gerektiğini henüz tam olarak anlamadıysanız endişelenmeyin. Sonraki bölümlerde, işlenmiş aydınlatmamızda fiziksel olarak çok daha makul sonuçlar elde etmek için yansıma denkleminin nasıl kullanılacağını keşfedeceğiz ve tüm parçalar ve parçalar yavaş yavaş birbirine uymaya başlayacak.

PBR Materyallerinin Yazılması

PBR'nin altında yatan matematiksel model hakkında bilgi sahibi olarak, doğrudan PBR denklemlerine besleyebileceğimiz bir yüzeyin fiziksel özelliklerini sanatçıların genel olarak nasıl yazdığını açıklayarak tartışmayı sonlandıracağız. Bir PBR boru hattı için ihtiyaç duyduğumuz yüzey parametrelerinin her biri dokular tarafından tanımlanabilir veya modellenebilir. Dokuları kullanmak bize her bir belirli yüzey noktasının ışığa nasıl tepki vermesi gerektiği konusunda parça başına kontrol sağlar: bu noktanın metalik, pürüzlü veya pürüzsüz olup olmadığı veya yüzeyin farklı dalga boylarındaki ışığa nasıl tepki verdiği.

Aşağıda, bir PBR oluşturucuya sağlanmışsa, görsel çıktısıyla birlikte bir PBR ardışık düzeninde sıklıkla bulacağınız dokuların bir listesini göreceksiniz:

Albedo: albedo dokusu, her bir doku için yüzeyin rengini veya bu doku metalik ise taban yansıtıcılığını belirtir. Bu, daha önce dağınık doku olarak kullandığımız şeye büyük ölçüde benzer, ancak tüm aydınlatma bilgileri dokudan çıkarılır. Dağınık dokular genellikle görüntünün içinde bir albedo dokusunda istemediğiniz hafif gölgeler veya koyu yarıklar içerir; sadece yüzeyin rengini (veya kırılan absorpsiyon katsayılarını) içermelidir.

Normal: normal harita dokusu, normal haritalama bölümünde daha önce kullandığımız gibidir. Normal harita, bir yüzeyin düz emsalinden daha engebeli olduğu yanılsamasını vermek için parça başına benzersiz bir normal belirlememize izin verir.

Metalik: Metalik harita, bir tekselin metalik olup olmadığını teksel başına belirtir. PBR motorunun nasıl kurulduğuna bağlı olarak, sanatçılar metalliği gri tonlamalı değerler veya ikili siyah veya beyaz olarak yazabilirler.

Pürüzlülük: Pürüzlülük haritası, doku bazında bir yüzeyin ne kadar pürüzlü olduğunu belirtir. Pürüzlülüğün örneklenen pürüzlülük değeri, yüzeyin istatistiksel mikro yüzey yönelimlerini etkiler. Daha pürüzlü bir yüzey daha geniş ve daha bulanık yansımalar alırken, pürüzsüz bir yüzey odaklanmış ve net yansımalar elde eder. Bazı PBR motorları, bazı sanatçıların daha sezgisel bulduğu bir pürüzlülük haritası yerine bir düzgünlük haritası bekler. Bu değerler daha sonra örneklendikleri anda pürüzlülüğe çevrilir (1.0 - düzgünlük).

AO: ortam tıkanıklığı veya AO haritası, yüzeyin ve potansiyel olarak çevreleyen geometrinin ekstra gölgeleme faktörünü belirtir. Örneğin bir tuğla yüzeyimiz varsa, albedo dokusunun tuğlanın yarıkları içinde gölgeleme bilgisi olmamalıdır. Ancak AO haritası, ışığın kaçması daha zor olduğu için bu karartılmış kenarları belirtir. Aydınlatma aşamasının sonunda ortam tıkanıklığını hesaba katmak, sahnenizin görsel kalitesini önemli ölçüde artırabilir. Bir ağ/yüzeyin ortam tıkanıklık haritası ya manuel olarak oluşturulur ya da 3D modelleme programlarında önceden hesaplanır.

Sanatçılar, bu fiziksel temelli girdi değerlerini doku bazında ayarlar ve ince ayarlar ve doku değerlerini gerçek dünya malzemelerinin fiziksel yüzey özelliklerine dayandırabilir. Bu, PBR işleme hattının en büyük avantajlarından biridir, çünkü bir yüzeyin bu fiziksel özellikleri, ortam veya aydınlatma kurulumundan bağımsız olarak aynı kalır ve sanatçıların fiziksel olarak makul sonuçlar elde etmesini kolaylaştırır. Bir PBR ardışık düzeninde oluşturulan yüzeyler, farklı PBR işleme motorları arasında kolayca paylaşılabilir, bulundukları ortamdan bağımsız olarak doğru görünecek ve sonuç olarak çok daha doğal görünecektir.

Ek Okumalar

Orijinal Kaynak: Theory

Çeviri: Nezihe Sözen

Last updated