本文是GAMES 202的學習筆記,主要內容包括Microfacet BRDF和LTC,介紹Disney principled BRDF。
1. Real-Time Physically-Based Materials 綜述
1.1 Physically-Based Rendering
基於物理的渲染:渲染內部的任何話題都應在pbr范圍之內,例如材質(materials)、光照(lighting)、相機(camera)、光線傳播(light transport)等。
但實時渲染中提到的PBR多用於指PBR材質,實時渲染在材質豐富程度方面遠遠落后於離線渲染,而且質量較差,並不完全物理正確。
1.2 實時渲染中的材質種類
1.2.1 物體表面上定義的材質
- Microfacet models:微表面模型
- Disney Principled BRDF:套材質的種類多效果好,不是PBR,是基於artist的角度來考慮的
1.2.2 體積上定義的材質
由於光線會進入到雲、煙、霧、皮膚、頭發等體積里,在RTR中基於體積上要比基於表面的困難許多,我們大部分考慮的還是光線在這些體積中作用一次(single)和多次(multiple)的分離考慮方法。
2. Microfacet models微表面模型
微表面理論認為物體在宏觀上看上去是平的,但是在微觀上看去會看到各種各樣的微表面,這些微表面的朝向,也就是法線各不相同,這些微表面法線的分布導致的渲染出的結果各不相同。
Microfacet BRDF:
2.1 F項
菲涅爾項,表示觀察角度與反射的關系。
有多少能量被反射取決於入射光的角度,當入射方向接近grazing angle掠射角度的時候,光線是被反射的最多的,也就是當你的入射方向與法線幾乎垂直時候,反射的radiance是最多的。(由於光路的可逆性,我們可以認為眼睛看過去的方向是光線入射方向)
下圖中最右邊一張接近grazing angle:
菲涅爾項告訴我們有百分之多少的能量會被反射出來。
推導菲涅爾項時要考慮光線的S極化和P極化效果,公式比較復雜,因為要考慮不同介質,如從空氣到物體表面各自的折射率和入射角折射角,最終推導出下面的公式:
平常使用的是上面公式的一個近似版本:
其中\(R_0\)(基礎反射率)取決於物體,不同物體的\(R_0\)各不相同。
2.2 D項
微表面的法線分布,決定這一項的是不同微表面朝向的法線分布。
當朝向比較集中的時候會得到Glossy的結果;如果朝向特別集中指向時認為是specular的;如果比較分散會得到diffuse的結果:
我們把表面法線分布的函數定義為Normal Distribution Function(NDF),常用的有Beckmann、GGX等。
2.2.1 Beckmann 模型
2.2.1.1 一維高斯函數
a表示得到曲線的高度;
b(μ)是指曲線在x軸的中心;
c(σ)指width(與半峰全寬有關);
2.2.1.2 Beckmann NDF
為了描述法線分布,肯定是一個對於微表面的法線方向(半程向量方向)\(h\)的函數,\(h\)是半球上任一方向,為了描述這一方向對應的值是多少我們需要NDF:
\(\alpha\)描述的是法線粗糙程度,粗糙程度這個值越小,表面就越光滑;
\(\theta_{h}\)描述微表面半程向量法線與宏觀表面法線(0,0,1)方向n的夾角;
定義只與\(\theta\)有關,與\(\phi\)無關,因此表述的是各向同性的結果,也就是沿着中心旋轉得到的是相同的結果。
高斯分布公式中的\(x\)對應這里的\(\tan \theta_{h}\)而不是\(\theta_{h}\),因為高斯函數被定義在了Slope space坡度空間上的。
\(\tan \theta_{h}\)與\(\theta_{h}\)關系如圖所示,一維中\(\tan \theta_{h}\)就是法線延長到切線的交點到宏觀法線頂端的距離,二維中則是與切表面的交點到宏觀法線頂端的距離。
由於高斯函數的定義域是非常大的,但在過了3σ之后會縮減到非常小但不是0,為了滿足這一性質定義在坡度空間,因為雖然距離非常遠,但是一定對應着單位球(圓)上一個有限的角度,從而保證在Slope space中無限大的函數無論如何也不會出現面朝下的微表面。
2.2.2 GGX 模型
Beckmann模型的NDF曲線與GGX模型的NDF曲線相比有一個明顯的特點:Long tail 長尾性質。
長尾特性帶來兩個好處:
- Beckmann的高光會逐漸消失,而GGX的高光會減少而不會消失,這就意味着高光的周圍我們看到一種光暈的現象;
- GGX除了高光部分,其余部分會像Diffuse的感覺;
對比圖:
2.2.3 GTR 模型
GTR(Generalized Trowbridge-Reitz),多了參數γ,根據γ不同可以調節拖尾長度。包括了本身GGX,當γ=2時候就是GGX;當γ超過10會接近Beckmann;γ<2會有更長的拖尾。
下圖馬里奧紙片王國中使用了更小的γ:
2.3 G項
Shadiowing-Masking有另外一個名稱:Geometry Term。這也是縮寫為G的原因
用於解決微表面之間的自遮擋問題,尤其是在角度接近grazing angle時。
由於在微觀上有不同的微表面,虛線部分本該入射的光被遮擋了;由於光線時可逆的,不只是看過去被遮擋,往外看時也被遮擋:
左圖從light出發發生的微表面遮擋現象叫做Shadiowing;
右圖從eye出發發生的微表面遮擋現象被稱為Masking。
引入G項就是為了考慮由於遮擋產生的darkening現象,在接近grazing angle時遮擋現象最大也就是接近於0,垂直看向時無遮擋也就是1。如果不考慮G項,Microfacet BRDF分母中的\((\mathbf{n}, \mathbf{i})(\mathbf{n}, \mathbf{o})\)在入射方向、出射方向和法線的夾角接近90°時,會得到一個接近0的數,導致邊緣過曝:
GGX Shadowing-Making項:
直接光照時:\(k=\frac{\left(\alpha+1\right)^2}{8}\),間接光時:\(k=\frac{\alpha^2}{2}\)
2.4 能量補償
隨着粗糙程度變大,我們渲染得到的結果卻越暗:
當表面越粗糙的時候,反射光更容易會被表面擋住,同時越粗糙的表面在表面之間彈射的次數越多。但G項只考慮了一次彈射,導致粗糙表面丟失了很多能量。
離線渲染中補償這些丟失的能量,通常實在微表面做類光線追蹤,時間代價比較大。
2.4.1 基本思路
反射光看作兩種情況:
- 當不被遮擋的時候,這些光就會被看到;
- 當反射光被微表面遮擋的時候,認為這些被擋住的光將進行后續的彈射,直到能被看到。
2.4.2 The Kulla-Conty Approximation
這種方法是通過經驗去補全多次反射丟失的能量,其實是創建一個模擬多次反射表面反射的附加BRDF波瓣->fms,利用這個BRDF算出消失的能量作為能量補償項。
首先需要計算最后反射出了多少能量:
下面的式子把BRDF、Lighting、cos在半球上積分,計算出射的能量:
- 認為任何方向入射的Radiance是1,也就是rendering equation中的Lighting項是1(因為是1所以式子中沒有出現);
- 同樣假設BRDF是各向同性的,也就是與i、o無關的;
- 最終積分的結果意義是,在uniform的lighting=1的情況下,在經歷了1 bounce之后射出的總能量 \(E\left(\mu_{o}\right)\)
因為\(\frac{\mathrm{d}f(x)}{\mathrm{d}x}=f'(x)\),\(\mathrm{d}f(x)=f'(x)\mathrm{d}x\),所以 \(\sin\theta\cos\theta\mathrm{d}\theta=\sin\theta\mathrm{d}(\sin\theta)\),最后用\(\mu=\sin\theta\)進行了換元。
出射能量為\(E\left(\mu_{o}\right)\)那么被遮擋的能量就有 \(1-E\left(\mu_{o}\right)\),因為BRDF的可逆性,不僅出射會丟失能量,入射也會丟失能量。經過推導可以得到丟失能量的BRDF:
將其帶入渲染方程可以驗證丟失的能量為\(1-E\left(\mu_{o}\right)\) :
\(E_{\mathrm{ms}}\left(\mu_{o}\right)\)是二重積分,可以預積分將其打成關於\(\mu_{o}\)和\(rough\)表格:
加上損失的能量后效果好很多:
2.4.3 當單次反射的BRDF是有顏色的情況
有顏色就意味着:物體發生了能量吸收的情況,也就是有額外能量損失,也就是單次反射的積分結果不是1。
平均菲涅爾項:\(F_{avg}\),不管入射角多大,平均每次反射會有多少能量反射
我們可以將能看到的能量分為不同類型:
- 能夠直接看到的能量:\(F_{avg}*E_{\mu_{o}}\)
- 一次彈射后看到的能量:\(F_{avg}*(1-E_{\mu_{o}})*F_{avg}*E_{\mu_{o}}\)
- k次彈射后看到的能量:\(F_{avg}^k*(1-E_{\mu_{o}})^k*F_{avg}*E_{\mu_{o}}\)
把0次到k次彈射的結果相加,得到一個無窮級數,最終得到了下式的顏色項:
直接將它乘進上節得到的BRDF中\(f_{\mathrm{ms}}\left(\mu_{0}, \mu_{i}\right)\)中,積分可得到有顏色因素的能量補償,效果如圖:
PS:用疊加Diffuse項來補償能量的方法,是完全錯誤的
2.5 Linearly Transformed Cosines
LTC->線性變換的余弦,采用線性變換球面分布的數學思想成功的解決了光澤反射的面光源問題,它有以下特點:
- 主要是針對GGX模型,對於其他模型也同樣適用
- 做的是不考慮shadow的shading
- 光源是多邊形光源,且發出的radiance時uniform的
2.5.1 Lobe
Lobe就是在固定一邊方向下的brdf的函數圖象,由於BRDF是一個4維的函數,在固定一邊之后就變為了2維的函數。
沒有Ltc計算光照需要在多邊形光源上我們需要取很多采樣點,並且光源與shaing point連線判斷遮擋。
2.5.2 LTC核心方法
- 在固定入射方向后,將出射的lobe(brdf的lobe)轉變為一個余弦函數。球面的所有方向經過這個線性變換后使得brdf的lobe朝向向上;
- 在轉換Brdf的lobe時,將多邊形光源也進行變換;
- 將shading point點任意brdf的lobe在任意多邊形光源下積分求shading的問題 轉變為在一個固定cos函數下對任意的多邊形光源積分求shading;
2.5.3 線性變換球面分布
首先原本面光源的光照計算公式:
S為面光源區域,s為面光源上的某一個點,p為着色點,\(n_p\) 為着色點法線, \(\omega_i\)為s到p的向量, \(\theta_p\) 為 \(n_p\)與\(\omega_i\)的夾角。
Daniel給出了無AO漫反射面光源公式:
\(\theta_p\) 為 面光源上s點的法線\(n_s\)與\(-\omega_i\)的夾角。可以看出來兩個式子極其的相似,只是光澤反射多了復雜的BRDF以及面光源上紋理的顏色L。
線性變換球面分布(LTSDs)的就是對於任意一個球面分布函數,一定可以通過一個線性變換矩陣將其變化到另外一個球面分布函數。
BRDF是一個球面分布函數,\(cos(\theta_s)\)也是一個球面分布函數,那么:
M就為線性變換矩陣,也就是說對於任意一個\(f\left(p, w_{i}, w_{o}\right)\)一定找的到一個M變換矩陣把他變換到\(cos(\theta_s)\),也就是核心思想的第三點:
2.5.4 線性變換余弦分布
現在我們將變換過的BRDF帶入最開始的面光源光照計算公式:
J項是雅可比行列式,用於線性變換之后面積發生變化進行一個歸一化操作,和M矩陣一樣預計算存在紋理中。
以着色點為頂點,我們的面光源為底,就構成了一個三棱錐如左圖;由於 \(w_{i}\) 是平面上某一點到着色點的向量,因此我們在實際的線性變換過程是采用直接將這三棱每一條側邊向量乘以線性變換矩陣,這樣就將等價平面中所有的\(w_{i}\)進行了線性變換。這也等價於將面光源進行了線性變換:
其中\(L\left(s,-\omega_{i}\right)\)可以用類似IBL的方法生成Mipmap,可以從積分中拿出,最后得到公式:
3. Disney's principle BRDF
Disney's principle BRDF誕生的首要目的就是為了讓artist使用方便,因此它並不要求在物理上完全正確;但是在RTR中我們認為Disney's principle BRDF也算是PBR材質。
引用
GAMES 202
圖片來自GAMES 202 PPT
https://gunay-pi.com/chapter-9-physically-based-shading/8/
https://zhuanlan.zhihu.com/p/385438367
https://zhuanlan.zhihu.com/p/384559264
https://zhuanlan.zhihu.com/p/68025039
https://zhuanlan.zhihu.com/p/360040187