光照基本理論

1. 光照交互

人之所以能夠看見物體似袁,是因為有光線進入人眼洞辣,而進入人眼的光線根據(jù)來源可以分為自發(fā)光與反射光,太陽昙衅,蠟燭扬霜,燈光等屬于自發(fā)光,月亮其他物件上的光照屬于反射光而涉。

因為自發(fā)光計算比較簡單著瓶,因此圖形學中對于光照計算與模擬通常集中在反射光上。反射光根據(jù)反射次數(shù)又可以分成直接光照(從光源出來后經(jīng)過單次反射到達人眼)與間接光照(經(jīng)多次反射后到達人眼)兩種啼县。因為不同物體以及同一物體不同位置的反射光照不相同材原,才使得我們能夠感知到不同物體的形狀乃至屬性沸久。

按照反射理論,只有反射進入人眼的光線才能被人眼感知余蟹,但是將一個平整的物體(比如一塊平滑的木板)放在完全陰暗環(huán)境中卷胯,之后只開啟一盞聚光燈,我們卻能夠從各個角度看到物體威酒,這說明看似平滑的物體窑睁,在光線的眼中實際上是不平滑的,如下圖所示葵孤,將物體表面進一步放大以后担钮,可以看到物體表面實際上是布滿各種孔洞,使得入射的光線被反射到了各個方向尤仍,這種模型我們稱之為微表面模型(microfacet model)箫津,而這種模型則是圖形學中PBR光照理論的基礎(chǔ)。

微表面模型

實際上吓著,光線與物體的交互比這個更為復雜鲤嫡,上面的微表面模型只考慮了光線照射到物體上直接反射的情況,但是除了反射之外绑莺,光線還會出現(xiàn)透射現(xiàn)象暖眼,透射包括折射,多次反射纺裁,吸收等多種交互诫肠。

如下圖所示,光線照射到物體上之后欺缘,直接反射的光線只占一部分栋豫,另一部分會進入到物體內(nèi)部,在內(nèi)部發(fā)生一次以及多次交互谚殊,之后部分穿出物體表面丧鸯,部分就湮滅在物體內(nèi)部。

反射+透射

在反射的光線中嫩絮,方向比較一致的反射部分丛肢,我們稱之為鏡面反射(specular,這部分光線通常來自于較為光滑物體上的直接反射部分)剿干,方向比較隨機的反射部分蜂怎,我們稱之為漫反射(diffuse,這部分反射來自于透射后穿出表面的反射以及極其粗糙物體上上的直接反射部分)置尔。

1.1 金屬與非金屬

金屬與非金屬由于分子結(jié)構(gòu)的不同杠步,其對于光線的作用也是不同的。

對于非金屬物體,光線與其的交互方式跟上述理論比較一致幽歼,光線垂直入射到物體表面上朵锣,直接反射的部分較少(大概只占4%[1]),大多數(shù)的光線會穿透物體表面试躏,在其中經(jīng)過透射交互后反射出來猪勇,因此主要表現(xiàn)為漫反射為主。

對于金屬物體颠蕴,其內(nèi)部的分子結(jié)構(gòu)為金屬陽離子與自由電子泣刹,光線進入到金屬內(nèi)部后,會被自由電子完全吸收犀被,因此金屬物體通常只有鏡面反射(不考慮物體表面粗糙度的情況下)椅您,沒有漫反射。而金屬物體上的直接反射比例也比非金屬要大得多寡键。下圖給出了不同的材質(zhì)上光線垂直入射時的直接反射比例(F0)掀泳,可以看到金屬與非金屬之間的數(shù)值存在較大的差異。

至于金屬與非金屬為什么會有這種差別西轩,ChatGPT的回復是:

1. 電子結(jié)構(gòu):光照射在物體表面上员舵,之所以會發(fā)生反射,主要是因為物體內(nèi)部的電子與光的電磁場相互作用的結(jié)果藕畔。
1.1 金屬原子間的相互作用較弱马僻,這使得金屬中的自由電子容易在整個金屬內(nèi)部傳播,因此金屬的電子結(jié)構(gòu)中存在許多自由電子注服,當光照射到金屬表面時韭邓,這些自由電子會與光中的電磁場相互作用,產(chǎn)生反射溶弟。
1.2 非金屬材料中的電子通常是與原子核緊密結(jié)合的女淑,且非金屬原子間的相互作用較強,這使得非金屬中的電子在原子間的傳播受到限制辜御,不容易形成自由電子鸭你,因此非金屬的反射率較低。
2. 能帶結(jié)構(gòu):金屬的導帶與價帶之間沒有能隙擒权,使得金屬對光的吸收較弱苇本,因此金屬的反射率較高。而非金屬的導帶與價帶之間存在能隙菜拓,使得非金屬對光的吸收較強,從而降低了非金屬的反射率笛厦。
3. 表面粗糙度:非金屬材料的表面粗糙度通常較高纳鼎,這會導致光在表面上產(chǎn)生多次散射,使得反射光的強度減弱,從而降低了非金屬的反射率贱鄙。

金屬非金屬直接反射比例

1.2 菲涅爾反射

所謂的菲涅爾反射指的是反射的強度與觀察角度存在一定的關(guān)聯(lián)的現(xiàn)象劝贸,法國物理學家菲涅爾最先觀察并給出了一組反射率與折射率的公式,稱之為菲涅爾方程逗宁,完整的菲涅爾方程比較復雜映九,對于日常工作而言,我們只需要知道瞎颗,在菲涅爾方程的作用下件甥,光線入射角度越大,與物體表面法線夾角越接近90度哼拔,那么反射的比例也就越大就行了引有。

2. 輻射理論

前面介紹的是一些定性的內(nèi)容,下面來介紹一些定量的內(nèi)容倦逐。

光是一種電磁波譬正,具有輻射能量,對于一個表面積為A的物體而言檬姥,假設(shè)光源在時間段t內(nèi)輻射到此物體上的總能量為Q曾我,那么此物體單位時間內(nèi)收到的輻射功率(我們稱之為輻射通量(flux))在這里用\phi來表示(單位為watt),那么:
\phi = \frac{dQ}{dt} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(1)

又健民,令物體單位表面積上收到的輻射功率為輻射照度(irradiance抒巢,單位為watt/m^2),用E表示:
E=\frac{d\phi} {dA}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(2)

照度表示的是某個點所接收到的光照強度荞雏,這個是從接受光照的物件角度出發(fā)的概念虐秦,這也是渲染最終所需要計算的變量。因為某個點所接收到的光照強度需要考慮各個方向的入射光線凤优,這里還需要對光線的角度做一個定義悦陋,為了描述方便,前輩們引入了立體角(solid angle)的概念筑辨。

如下圖所示俺驶,立體角是二維平面角在3D空間中的延伸,2D平面角對應的是圓形上的一段圓弧所對應的夾角棍辕,而立體角對應的則是球面上的一個圓形曲面對應的夾角暮现,其單位為球面度(sr),整個球的立體角為4\pi楚昭,半球的立體角為2\pi栖袋。

立體角

假設(shè)光源照射到物體表面時,對應的立體張角為\omega抚太,令單位立體角內(nèi)的輻射功率為輻射強度(radiant intensity)塘幅,從含義上來看昔案,這個概念是用于光源的而非普通接受光照的物件的,用I表示电媳,單位為watt/sr
I = \frac{d\phi}{d\omega}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(3)

再令單位面積單位立體角內(nèi)的輻射功率為輻射率(radiance)踏揣,這個概念跟光輻射照度一樣,是用于接受光照輸入的物件的匾乓,用L表示捞稿,單位為watt/(m^2 \cdot sr)
L = \frac{dI}{d A_{proj}} = \frac{dE}{d\omega} = \frac{d^2\phi}{dA_{proj}d\omega}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(4)

上式中,A_{proj}表示的是物體在光線方向上的投影面積拼缝,如下圖所示娱局,計算公式為dA_{proj} = dAcos\theta

投影面積示意圖

3. 渲染方程

根據(jù)前面的基本理論,我們可以給出基本的渲染方程:
L_o(x, \omega_o, \lambda, t) = L_e(x, \omega_o, \lambda, t) +\int_{\Omega}f_r(x, \omega_i, \omega_o, \lambda, t) L_i(x, \omega_i, \lambda, t) cos \theta d\omega_i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(5)

上述公式中L_o表示的是輸出的輻射率珍促,L_e表示的是物體自發(fā)光的輻射率铃辖,L_i表示的是某個方向上輸入的輻射率,考慮輸入光方向與物體表面夾角導致的投影面積減損猪叙,還需要乘上cos\theta娇斩。

\lambda表示的是光的波長,\omega_i表示的是輸入光方向穴翩,\omega_o表示的是輸出光方向犬第,x表示的是當前點的位置,t表示的是時間芒帕,f_r表示的是雙向散射分布函數(shù)(BSDF, bidirectional scattering distribution function歉嗓,有BSDF = BRDF + BTDF + BSSRDF,BRDF=bidirectional reflectance distribution function, 表示的是反射部分的輸入輸出關(guān)系背蟆,BTDF=bidirectional transmittance distribution function, 表示的是投射部分的輸入輸出關(guān)系鉴分;BSSRDF=bidirectional scattering-surface reflectance distribution function,表示的是光線在物體上的入射點與出射點不重合情況下的反射關(guān)系)带膀,是物體的固有屬性志珍,表示的是特定輸入角度下,單位輻射率的輸入光在經(jīng)過與物體的交互后垛叨,沿著給定的輸出方向上的輸出輻射率伦糯。

根據(jù)渲染所關(guān)心的內(nèi)容,我們可以將上述公式簡化一下嗽元,得到如下公式:
L_o(x, \omega_o) = \int_{\Omega}f_r(x, \omega_i, \omega_o) L_i(x, \omega_i) cos \theta d\omega_i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(6)

從這個公式我們可以看到敛纲,輸入光L_i以及光線法線夾角\theta都比較直觀,只有雙向光照分布函數(shù)f_r比較抽象剂癌,而對應于這個函數(shù)的不同淤翔,人們給出了不同的光照模型。

4. 光照模型

為了模擬真實渲染效果佩谷,圖形學界的前輩們開發(fā)了數(shù)目眾多的光照模型办铡,有的注重效果辞做,有的則注重性能,為了方便對比寡具,這里將平時工作中接觸到的接受度比較高的光照模型做一下梳理,因為平時工作中使用最多的雙向光照分布函數(shù)是BRDF稚补,因此這里出于簡單考慮童叠,暫時忽略BTDF/BSSRDF等復雜光照交互。

4.1 BRDF

BRDF是bidirectional reflectance distribution function的縮寫课幕,而所謂的BRDF厦坛,指的是用于描述對于給定方向給定輸入光強,給定方向的輸出反射光強的分布函數(shù)乍惊,用公式來描述的話杜秸,可以寫成如下形式:
f_r(\omega_i, \omega_o) = \frac{dL_o(\omega_o)}{d E_i(\omega_i)}=\frac{dL_o(\omega_o)}{L_i(\omega_i)cos \theta_i d\omega_i} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(7)

這個等式來源于前面的公式(6)。

BRDF的公式設(shè)計不是隨心所欲的润绎,通常需要滿足如下幾個原則:

  1. 正值輸出原則
    f_r > 0
  2. 光路可逆原則(即交換light vector與view vector撬碟,公式依然成立)
    f_r(\omega_i, \omega_o) = f_r(\omega_o, \omega_i)
  3. 能量守恒原則
    \int_{\Omega}f_r(\omega_i, \omega_o) cos \theta_o d\omega_o \leqslant 1

而BRDF設(shè)計的時候需要考慮如下的幾個因素:

  1. 物理上要精確
  2. 數(shù)值上要精確,即通過對公式輸出的反射lobe與測量得到的反射lobe數(shù)據(jù)進行對比莉撇,不應該出現(xiàn)太大偏差
  3. 計算上要高效

根據(jù)實現(xiàn)原理來看呢蛤,BRDF可以分成兩類,分別是解析式(Analytical)與非解析式(non-analytical棍郎,比如手繪或者通過測量數(shù)據(jù)模擬)其障;而按照光照類型來看,又可以分成Local Illumination與Global Illumination兩類涂佃,比如使用最早的Phong Reflection Model與Blinn-Phong Reflection Model就是Local Illumination Model励翼,實際上目前實時渲染中使用的基本上都是Local Illumination Model。

4.2 Phong Reflection Model

Phong Reflection光照模型是具有比較悠久歷史的光照模型辜荠,這個模型提出于1975年汽抚,是一種經(jīng)驗模型,也就是說侨拦,這個模型的提出純粹是出于主觀經(jīng)驗判斷殊橙,其中的參數(shù)并沒有太多物理意義。

整個光照公式可以寫成如下形式:
L_o = k_aL_a+\sum (k_d c_d cos \theta_i + k_s (R \cdot V)^\alpha) L_{i} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(8)

求和之外的部分為Ambient光照狱从,k_d為材質(zhì)的漫反射率膨蛮,k_s為材質(zhì)的鏡面反射率,根據(jù)能量守恒原則季研,通常有k_d = 1 - k_s敞葛,c_d為材質(zhì)的基色,對于金屬而言与涡,c_d = 0惹谐,對于非金屬而言持偏,c_d = albedo,總結(jié)起來就是c_d = albedo * ( 1 - metalness)氨肌。

求和針對場景中的多盞光源進行鸿秆,用通俗一點的話來解釋這個公式,可以寫成如下形式:Ambient+Sum(Diffuse)+Sum(Specular)

這里需要對Specular部分做一下簡單介紹怎囚,如下圖所示卿叽,公式中的R對應的是入射光線沿著法線的反射方向,而V對應的則是視線方向:

其中R與N,L之間的關(guān)系可以用如下公式給出:
R = 2(N\cdot L)N - L~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(9)

高光部分系數(shù)是一個指數(shù)形式:
Specular_{coe} = (V \cdot R)^{\alpha}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(10)

這個公式說明了高光反射光強比例近似等同于視線與反射光線夾角的點乘恳守,在這種情況下考婴,得到的高光反射區(qū)域會比較廣,參考下面n=1的曲線(其中的n對應的就是前面公式中的\alpha)催烘,可以看到光強隨著角度的增加沥阱,下降較為緩慢,而增加n則可以縮小高光區(qū)域伊群。

高光反射強度曲線圖

使用不同的指數(shù)考杉,得到的表現(xiàn)效果有所不同,n越大高光越集中在岂,強度也越高

不同指數(shù)下的高光表現(xiàn)

另外奔则,注意到,高光區(qū)域越廣蔽午,根據(jù)能量守恒原則易茬,對應的高光強度應該越低,因此還需要對上述Specular乘上一個調(diào)制參數(shù)Ks

不過由于指數(shù)計算消耗比較高及老,在實際使用的時候抽莱,還可以做一下近似,比如使用泰勒展開來模擬:
max(0, R \cdot V)^\alpha = max(0, 1-\lambda)^{\beta \gamma} = (max(0, 1-\lambda)^\beta)^\gamma \approx max(0, 1-\beta\lambda)^\gamma~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(11)

其中\lambda = 1 - R \cdot V, ~~ \beta = \frac{\alpha}{\gamma}骄恶,這樣做怎么能達到優(yōu)化性能呢食铐?如果我們選取的\gamma = 2^n,那么上述公式中最后的計算就轉(zhuǎn)換成了多次平方僧鲁,而這個計算比直接計算指數(shù)要更為高效虐呻。

效果對比

上圖給出了1-\beta \lambda(1-\beta)^ \lambda的效果對比,可以看到寞秃,在\lambda較小的時候斟叼,兩者是非常接近的,也就是說春寿,前面的假設(shè)成立的條件是\gamma要足夠大朗涩,通常會選擇\gamma > 4,下圖給出了當\lambda = 0.1時以\beta為自變量1-\beta \lambda(1-\beta)^ \lambda的對比圖:

可以看到當\beta較小的時候绑改,兩者結(jié)果是比較一致的谢床,\beta越大兄一,差的越遠。而\lambda越小识腿,差距越小出革,下圖給出了不同\lambda下兩者的差距對比圖:

將這個光照模型改寫成BRDF的形式,不考慮環(huán)境光渡讼,那么其BRDF對應的公式給出如下:
f_r(\omega_i, \omega_o) = \frac{k_d c_d}{\pi} + \frac{k_s cos^{\alpha} \theta_r}{\pi cos \theta_i}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(12)

這個公式相當于最開始的光照公式除以\pi cos \theta蹋盆,而這個除法是從BRDF的跟L_r的計算關(guān)系中推導而來的。

f_{diff} = \frac{k_d c_d}{\pi}對應的是diffuse部分的BRDF硝全,而這就是眾所周知的Lambert光照模型,此外楞抡,將滿反射系數(shù)與基色結(jié)合起來\rho_d = k_d c_d伟众,這個公式可以進一步可以改寫成如下形式:
f_r(\omega_i, \omega_o) = \frac{\rho_d}{\pi} + \frac{k_s cos^{\alpha} \theta_r}{\pi cos \theta_i}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(13)

上述這個公式還有一個問題,那就是當cos \theta_i接近0(也就是光線貼著物體表面入射時)召廷,specular項會接近無窮大凳厢,表現(xiàn)與真實表現(xiàn)不符合,因此在實際使用中有時候也會見到將這一項從分母中刪除的情況竞慢,公式就變成了如下形式:
f_r(\omega_i, \omega_o) = \frac{\rho_d}{\pi} + \frac{k_s cos^{\alpha} \theta_r}{\pi}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(14)

光照公式相應就變成了如下形式:
L_o = \sum (\rho_d+ k_s (R \cdot V)^\alpha) L_{i} cos \theta_i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(15)

而實際上先紫,移除了cos項之后,公式還滿足光路可逆原則(筹煮?)遮精,更接近物理真實,此外败潦,在這個公式下本冲,我們可以很容易的求取出specular在單個輸入光作用下輸出光強的最大值桅咆,因此可以很方便的對specular進行歸一化以滿足能量守恒:
R_s(\omega_i) = \frac{k_s}{\pi}\int_{\Omega_H}cos ^ \alpha \theta_rcos \theta_e d\omega_e \\ max(R_s(\omega_i)) = R_s(0) = \frac{2k_s}{\alpha +2}\\ (16)

上述公式中的R_s(\omega_i)表示的是以Halfway Vector(H = normalize(L + V))為方向軸的半球積分雀鹃,積分自變量是View Direction,當入射光線與表面法線方向相同的時候雨效,此時得到的R_s為最高沟饥,對應的就是上述公式中的R_s(0)添怔,此時\theta_e == \theta_r,用這個數(shù)值進行歸一化的話贤旷,得到最終的specular brdf公式給出如下:
f_{r_s}(\omega_i, \omega_o) = \frac{\alpha+2}{2\pi}R_F(0)cos^\alpha \theta_r~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(17)

更換成這種形式广料,就可以避免在公式中添加進無意義的k_s參數(shù),轉(zhuǎn)而使用材質(zhì)本身的垂直反射數(shù)據(jù)來計算遮晚,并且參數(shù)更加物理性昭,表現(xiàn)更加物理(\alpha越大,高光面積越小县遣,高光中心亮度越高糜颠,原始Phong Reflection能夠做到高光面積變小汹族,卻無法做到中心亮度增高),使用更加方便其兴,美術(shù)同學不需要根據(jù)\alpha來調(diào)整k_s顶瞒,不足之處在于\alpha的意義依然比較模糊。

將diffuse跟specular結(jié)合起來元旬,最終的brdf公式給出如下榴徐,在\rho_d + R_f \leqslant 1的情況下,這個公式是能量守恒的:
f_r(\omega_i, \omega_o) = \frac{\rho_d}{\pi} + \frac{\alpha+2}{2\pi}R_F(0)cos^\alpha \theta_r~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(18)

在上述公式作用下匀归,diffuse lobe跟specular lobe的形狀大致如下圖所示:


Phong模型的優(yōu)點在于實現(xiàn)簡單坑资,缺點則在于公式不夠物理,通常需要美術(shù)同學憑直覺調(diào)整參數(shù)穆端。

4.3 Blinn-phong光照模型

Blinn-Phong光照模型是以Phong光照模型為基礎(chǔ)進行了一系列改進優(yōu)化后的光照模型袱贮,這是OpenGL與D3D固定管線所使用的默認光照模型。

L_o = \sum (k_d(N \cdot L) + k_s(N \cdot H)^\alpha)L_i

Blinn-Phong跟Phong的區(qū)別在于体啰,Phong是反射式的BRDF攒巍,而Blinn-Phong則是微表面式的BRDF,在效果上荒勇,反射式的BRDF的高光形狀是圓形的柒莉,而微表面BRDF的高光形狀會隨著觀察角度的變化而出現(xiàn)伸縮,比較符合自然規(guī)律沽翔。

將上述光照計算公式改寫成BRDF的格式兢孝,給出如下:
f_r(\omega_i, \omega_o) = \frac{\rho_d}{\pi} + \frac{\alpha+4}{8\pi}R_F(0)cos^\alpha \theta_h

Halfway Vector

其中cos \theta_h = N \cdot H,當LHNR四個向量處于同一平面之中時搀擂,RV兩個向量的夾角西潘,是NH兩個向量夾角的兩倍;當四個向量不處于同一平面時哨颂,RV兩個向量的夾角喷市,接近NH兩個向量夾角的兩倍。

處于同一平面時威恼,NH結(jié)果總是比RV要大(夾角小品姓,余弦大),不同平面則不一定箫措,而為了得到接近Phong Shading的效果腹备,NH的指數(shù)就要大于RV的指數(shù):
(R \cdot V)^\alpha \\ (N \cdot H)^{{\alpha}^{'} }\\ \alpha^{'} > \alpha \\ \alpha^{'} = 4 \alpha
選取為原始\alpha的4倍比較接近Phong Shading的表現(xiàn)。

這個公式與Phong的BRDF的公式有如下區(qū)別

  1. 歸一化系數(shù)存在差別
  2. cos角度含義存在差別斤蔓,Phong的角度對應的是反射向量與觀察向量之間的夾角植酥,Blinn-Phong的角度對應的則是半向量Half-Vector與表面法線之間的夾角,這個夾角可以看成是表面粗糙程度的一種表征,存在物理含義
  3. 整個cos項可以看成表面法線分布函數(shù)友驮,\alpha的含義比較明晰漂羊,可以看成是表面法線分布函數(shù)NDF的參數(shù)

如果用R_F(\alpha_h)替換上述公式中的R_F(0)得到如下公式:
f_r(\omega_i, \omega_o) = \frac{\rho_d}{\pi} + \frac{\alpha+4}{8\pi}R_F(\alpha_h)cos^\alpha \theta_h

雖然上述公式將使得能量不再守恒,但是其效果卻比修正前要更好看一點卸留,對于絕緣體而言走越,隨著入射夾角的增加,其反射的強度應該有所增強耻瑟,這個公式符合這個規(guī)律(前面的不符合旨指?)

能夠滿足絕大多數(shù)材質(zhì)的需求,但是無法模擬一些特殊的效果喳整,比如shadowing & masking谆构。

Blinn-Phong光照模型通常是放在VS中計算的(當然,也可以放在PS中來提升質(zhì)量)框都,在效果上相對于Phong Shading低淡,在視角方向與表面法線方向夾角較大的時候,反射表面的高光形狀會呈現(xiàn)一種拉長的橢圓形瞬项,比較貼近太陽光在水面上的反射效果以及夜晚燈光在潮濕地表上的反射效果,Phong Shading的高光反射基本上是圓形的何荚。

在特定情況下囱淋,H可以看成是一個常量,當觀察者位于無窮遠(正交投影)以及太陽光位置位于無窮遠時(方向光)餐塘,H可以看成是恒定不變的妥衣,與表面法線方向無關(guān);Phong Shading中R的計算需要考慮N的方向戒傻,因此對于每個頂點或者像素都是不相同的税手,計算量更大,不過在透視相機的情況下需纳,這種優(yōu)化是不成立的芦倒,意義不大。

使用Blinn-Phong Shading可以消除部分視角下RV夾角超過90度被裁切掉所導致的瑕疵不翩,效果如下圖所示:

4.4. PBR理論

Disney在2012年的Siggraph上分享了他們實現(xiàn)Physically-based Rendering的相關(guān)理論兵扬,因為其易用性而得到了迅速推廣,目前業(yè)界的PBR算法基本上都是以此為基礎(chǔ)的口蝠。

傳統(tǒng)的blinn-phong模型中主要由三個參數(shù)進行控制(漫反射參數(shù)k_d器钟,鏡面反射參數(shù)k_s以及光澤度參數(shù)\alpha),但是這幾個參數(shù)的物理意義不是很明確妙蔗,因此在使用的時候?qū)γ佬g(shù)同學就不太友好傲霸,而Disney給出的PBR模型則主要通過如下的三個參數(shù)來對材質(zhì)進行描述:基色albedo,金屬度metalness以及粗糙度roughness。(當然昙啄,還有一些其他的用于一些特殊材質(zhì)的參數(shù)穆役,比如次表面參數(shù)等,因為并不通用跟衅,這里就不做深入介紹了)

在這個模式下孵睬,其光照計算方法與Blinn-Phong模型有著較大的差別,下面的Cook-Torrance就是PBR模式下的光照模型伶跷。

4.5 Cook-Torrance光照模型

Blinn-Phong相對于Phong模型主要的區(qū)別在于Specular上掰读,而Cook-Torrance模型的Diffuse部分也跟前面兩個模型一樣,區(qū)別只在于Specular部分叭莫。

f_r = k_d f_{lambert} + k_s f_{cook - torrance} \\ f_{cook - torrance} = \frac{DFG}{4(\omega_o \cdot N)(\omega_i \cdot N)}

可以看到整個公式最關(guān)鍵的就是分子中的三項D,F,G蹈集,接下來我們介紹一下這三項的物理意義與相應的計算公式。

4.5.1 法線分布函數(shù) - D

D表示的是法線分布函數(shù)雇初,從統(tǒng)計學上近似的表示了與中間向量取向一致的微平面的比率拢肆。

D

與這一項相關(guān)的參數(shù)有如下兩項:

  1. 微表面粗糙度,這個參數(shù)表示的是微表面法線集中程度
  2. 宏觀法線與視線的中間向量:h靖诗;僅m = h的表面點的朝向才會將光線l反射到視線v的方向郭怪,其他朝向的表面點對BRDF沒有貢獻。

常用的法線分布函數(shù)模型有如下幾種刊橘。

4.5.1.1 Blilnn-Phong分布

D = \frac{\alpha_p+2}{2\pi}(n\cdot h)^{\alpha_p}
(上面的形式從數(shù)值上看起來倒是更香Phong模型的鄙才?)由于直接使用上述公式會對美術(shù)制作不太友好(怎么不太友好?)促绵,實踐中常常會取\alpha_p = \frac{2}{\alpha ^2} - 2攒庵,變換后的NDF為:
D = \frac{1}{\pi \alpha^2}(n \cdot h)^{\frac{2}{\alpha ^2} - 2}

4.5.1.2 Beckmann分布

D = \frac{1}{\pi \alpha^2(n \cdot h)^4}e^{\frac{(n \cdot h)^2 - 1}{\alpha^2(n \cdot h)^2}}
上述公式中的\alpha與Blinn-Phong分布中的\alpha_p之間的關(guān)系給出如下:
\alpha_p = \frac{1}{\alpha^2} - 2

4.5.1.3 GGX分布

這個分布也稱為Trowbridge-Reitz分布,這個模型的特征為具有最長的尾部败晴,即當n \cdot h增長到比較大的數(shù)值時浓冒,GGX的衰減相對更為緩慢,使得其表現(xiàn)更為優(yōu)越尖坤,其公式給出如下:
D_{GGX}(m) = \frac{\alpha^2}{\pi((n \cdot m)^2(\alpha^2 - 1) + 1)^2} \\ \alpha = roughness^2
其中稳懒,m為微表面上待計算的目標方向的法線(UE4中此處直接使用的是h而非m),n為當前當前平面的法線慢味。

下圖給出三種法線分布模型的函數(shù)曲線僚祷,紅色為Beckmann,藍色為Blinn-Phong贮缕,綠色為GGX辙谜,可以看到前兩者基本上沒有區(qū)別,而GGX衰減更慢感昼。

三種NDF對比

下圖給出了不同的NDF的高光對比圖装哆,其中左側(cè)為Ground Truth,中間為GGX,右側(cè)為Beckmann蜕琴,因為其表現(xiàn)的優(yōu)越性萍桌,GGX已經(jīng)成為業(yè)界使用最為廣泛的NDF了

高光對比

下圖給出了不同粗糙度下GGX模型的高光表現(xiàn)

4.5.2 菲涅爾方程 - F

F項表示的是菲涅爾方程,描述的是在不同的表面角下表面所反射的光線所占的比率凌简。也就是前面Phong等光照模型中的k_s一項上炎,在使用這類光照模型的時候,可以通過這個公式計算出對應的k_s之后使用1-k_s求得k_d雏搂。

4.5.2.1 None

如果不考慮菲涅爾效應藕施,那么這一項可以直接取F_0,即
F_{None}(v, h) = F_0

4.5.2.2 Schlick

這一項目前使用最廣泛的是Fresnel-Schlick模型:

F_{schlick}(h, v, F_0) = F_0+(1-F_0)(1-h \cdot v)^5

其中F_0表示的額是入射光垂直于物體表面入射時的鏡面反射率凸郑,對于非金屬材質(zhì)而言裳食,這個數(shù)值對于RGB三個分量都是相同的,約等于4%芙沥,但是對于金屬材質(zhì)而言诲祸,這個數(shù)值就是RGB各不相同了,且一般遠大于4%而昨,通常會將金屬的基色用作F_0救氯,其數(shù)值可以通過查表來求得:

基礎(chǔ)反射率

為了兼顧金屬與非金屬材質(zhì),在實際使用中歌憨,可以通過如下代碼來計算:

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

關(guān)于這個公式径密,UE4還做了進一步的優(yōu)化,使用球面高斯替換指數(shù)計算躺孝。

球面高斯近似(Spherical Gaussian approximation)是一種曲線擬合方法,用于降低計算復雜度底桂,在實時渲染中可以幫助光線計算節(jié)省shader指令數(shù)植袍。

初始公式給出如下:
pow(1-cos \theta, 5) = exp2((5+0.788)/Log(2) * ((1-cos \theta) - 1)) \\ =exp2(-8.35*cos\theta)
在這個公式下,其結(jié)果與直接指數(shù)結(jié)果之間的對比如下圖所示:

為了提高擬合精準度籽懦,對參數(shù)做了進一步調(diào)整于个,修正后的公式給出如下:
pow(1-cos \theta, 5) = exp2(x * (cos \theta * cos \theta) + y * cos\theta) \\ = exp2(-5.55473 * (cos \theta * cos \theta) - 6.98136 * cos \theta) \\ =exp2((-5.55473*cos\theta - 6.98136)*cos \theta)

在這個公式下,與原始的指數(shù)公式的圖形對比如下圖暮顺,可以看到厅篓,基本上一致了:

在經(jīng)過UE修正后,原始的Fresnel-Schlick公式就變成了如下形式:
F_{SGApprox}(h, v, F_0) = F_0+(1-F_0)2^{(-5.55473(v \cdot h) - 6.98136)(v \cdot h)}

這個模型的缺點在于捶码,在specular增加的時候羽氮,diffuse不一定會減少,能量不守恒惫恼;性能消耗比Blinn-Phong要高不少档押。

4.5.2.3 Cook-Torrance

\eta = \frac{1+\sqrt{F_0}}{1-\sqrt{F_0}} \\ c = v \cdot h \\ g = \sqrt{\eta^2 + c^2 - 1}\\ F_{Cook-Torrance}(v, h) = \frac{1}{2}(\frac{g-c}{g+c})^2(1+(\frac{(g + c)c -1}{(g - c) c+1})^2)

4.5.3 幾何函數(shù) - G

G表示的是幾何函數(shù),描述的是微平面自身陰影的屬性,從統(tǒng)計學上對應的是微平面間相互遮蔽的比率令宿,這一項與表面的粗糙度以及法線恩不有關(guān)叼耙。如下圖所示,主要可以分成shadowing部分與masking部分:

shadowing & masking

陰影(Shadowing)部分表示微平面對入射光的遮擋粒没,一般為對光源方向L而言的筛婉;
遮蔽(masking)部分表示微平面對出射光的遮擋,一般為對觀察方向V而言的癞松。

如下圖所示爽撒,整個G函數(shù)的表達具有如下兩種形式:

導致遮擋的兩種形式

其中G1為微平面在單個方向(光照方向L或觀察方向V)上可見比例,分為遮蔽函數(shù)(masking function)和陰影函數(shù)(shadowing function)拦惋;G2為微平面在光照方向L和觀察方向V兩個方向上可見比例匆浙,稱為聯(lián)合遮蔽陰影函數(shù)(joint masking-shadowing function)

在實際使用中,我們需要根據(jù)具體材質(zhì)的實際情況厕妖,選取合適的微表面模型首尼,從而實現(xiàn)對G的定量描述,常用的PBR微表面模型有如下幾種:

4.5.3.1 Implict

G_{Implicit}(l, v, h) = (n \cdot l)(n \cdot v)

4.5.3.2 Smith遮蔽函數(shù)(Smith masking function)

這是業(yè)界所采用的主流遮蔽函數(shù)言秸,下圖展示了Smith模型(右)與真實世界(左)的對比软能,Smith模型具有不相關(guān)的表面,即每個微平面與其鄰域不相關(guān)的特點举畸。

原始的Smith模型只描述了出射光遮蔽函數(shù)查排,而Walter等人對其進行了推廣,將G做成可分離形式:遮蔽(masking)和陰影(shadowing)是獨立的抄沮,并分別計算跋核。
G_2(n, v, l, k) = G_{1-mask}(n, v, k)G_{1-shadow}(n, l, k)

其中G_{1-shadow}(n, l, k)表示光線方向的幾何陰影,簡稱為入射光遮蔽叛买,而G_{1-mask}(n, v, k)表示視線方向的幾何遮蔽砂代,簡稱出射光遮蔽

其中,單個遮蔽函數(shù)具有如下形式:
G_1(v) = \frac{1}{1+\Lambda(v)}

下面公式如果不做說明率挣,均有:
\alpha = roughness^2

4.5.3.2.1 Beckmann公式

c = \frac{n \cdot v}{\alpha \sqrt{1 - (n \cdot v)^2}} \\ G_1(v) = \frac{3.535c+2.181c^2}{1+2.276c+2.577c^2} ~ if ~~ c < 1.6 \\ G_1(v) = 1 ~ if ~~ c >= 1.6

4.5.3.2.2 Schlick-Beckmann/GGX等公式

下面這個公式是目前使用最廣的G_1分布函數(shù)刻伊,根據(jù)不同的k取值,可以得到一系列不同的G分布函數(shù)椒功,
G_{1-schlickGGX}(n, v, k) = \frac{n \cdot v}{(n \cdot v)(1-k) + k}

k_{Schlick-Beckmann} = \alpha \sqrt{\frac{2}{\pi}} \\ k_{Schlick-GGX} = \frac{\alpha}{2}

UE4中使用的Schlick-GGX模型對應的是如下一段代碼:

// Tuned to match behavior of Vis_Smith
// [Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering"]
float Vis_Schlick( float Roughness, float NoV, float NoL )
{
    float k = Square( Roughness ) * 0.5;
    float Vis_SchlickV = NoV * (1 - k) + k;
    float Vis_SchlickL = NoL * (1 - k) + k;
    return 0.25 / ( Vis_SchlickV * Vis_SchlickL );
}

4.5.3.2.3 GGX

\Lambda(v) = \frac{-1+\sqrt{1+\frac{1}{a^2}}}{2} \\ a = \frac{1}{\alpha tan \theta_v}
將上述公式代入前面公式得到:
G_1(v) = \frac{2}{1+\sqrt{1+\alpha^2 tan^2\theta_v}}
tan^2\theta_v = \frac{1}{cos^2\theta_v} - 1代入公式得到:
G_1(v) = \frac{2cos\theta_v}{cos\theta_v + \sqrt{cos\theta_v(cos\theta_v - \alpha^2cos\theta_v)+\alpha^2}}
這個公式對應的是UE4中的下面一段代碼:

// [Smith 1967, "Geometrical shadowing of a random rough surface"]
float Vis_Smith( float Roughness, float NoV, float NoL )
{
    float a = Square( Roughness );
    float a2 = a*a;

    float Vis_SmithV = NoV + sqrt( NoV * (NoV - NoV * a2) + a2 );
    float Vis_SmithL = NoL + sqrt( NoL * (NoL - NoL * a2) + a2 );
    return rcp( Vis_SmithV * Vis_SmithL );
}

4.5.3.3 Neumann

G_{Neumann}(l, v, h) = \frac{(n \cdot l)(n \cdot v)}{max(n \cdot l, n \cdot v)}

4.5.3.4 Cook-Torrance

G_{Cook-Torrance}(l, v, h) = min(1, \frac{2(n \cdot h)(n \cdot v)}{v \cdot h}, \frac{2(n \cdot h)(n \cdot l)}{v \cdot h})

4.5.3.5 Kelemen

G_{Kelemen}(l, v, h) = \frac{(n \cdot l)(n \cdot v)}{(v \cdot h)^2}

4.5.3.6 Smith-Joint

Smith-Joint是Heitz在2014年首次提出的遮蔽函數(shù)模型捶箱,這個模型考慮入射陰影和出射遮蔽之間的相關(guān)性,嘗試模擬由于微表面高度引起的遮蔽和陰影之間的相關(guān)性动漾《∈海考慮到兩者之間的關(guān)聯(lián),那么更為精確的表達形式應該如下述公式所描述:
G = G_2(l, v) = \frac{1}{1+\Lambda(l) + \Lambda(v)}

微平面(microfacet)在微表面(microsurface)內(nèi)升高得越多旱眯,對于出射方向未被遮蔽(unmasked)和入射方向未被掩蔽(unshadowed)的可見概率會同時增加悦屏。

按照上述公式节沦,如果將前面的GGX函數(shù)模型代入會使得結(jié)果異常復雜,因此UE4對這個模型做了簡化础爬,
下面公式給出的是UE4中的計算模型:
\alpha = roughness^2\\ \Lambda(v) = (n \cdot l)((n \cdot v)(1-\alpha)+\alpha) \\ G_{SmithJoint Approx}(l, v, h) = \frac{0.5}{\Lambda(v) + \Lambda(l)}

相關(guān)代碼給出如下:

// Appoximation of joint Smith term for GGX
// [Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"]
float Vis_SmithJointApprox( float Roughness, float NoV, float NoL )
{
    float a = Square( Roughness );
    float Vis_SmithV = NoL * ( NoV * ( 1 - a ) + a );
    float Vis_SmithL = NoV * ( NoL * ( 1 - a ) + a );
    // Note: will generate NaNs with Roughness = 0.  MinRoughness is used to prevent this
    return 0.5 * rcp( Vis_SmithV + Vis_SmithL );
}

在Cook-Torrance模型中甫贯,游戲和電影業(yè)界主流的方案是GGX分布和Smith聯(lián)合遮蔽陰影函數(shù)的組合,而UE4方案為GGX與Schlick-Beckmann近似的結(jié)合體看蚜。

這個模型的特點是在不增加計算復雜度的前提下叫搁,可以得到比可分離的遮蔽陰影函數(shù)更精確的結(jié)果

參考文獻

[1].PBR理論體系整理(一):基礎(chǔ)理論
[2].Phong reflection model -wikipedia
[3].The Phong Model, Introduction to the Concepts of Shader, Reflection Models and BRDF
[4]. Specular BRDF Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市供炎,隨后出現(xiàn)的幾起案子渴逻,更是在濱河造成了極大的恐慌,老刑警劉巖音诫,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨奕,死亡現(xiàn)場離奇詭異,居然都是意外死亡竭钝,警方通過查閱死者的電腦和手機梨撞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來香罐,“玉大人卧波,你說我怎么就攤上這事”用#” “怎么了港粱?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旦签。 經(jīng)常有香客問我查坪,道長,這世上最難降的妖魔是什么宁炫? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任偿曙,我火速辦了婚禮,結(jié)果婚禮上淋淀,老公的妹妹穿的比我還像新娘。我一直安慰自己覆醇,他們只是感情好朵纷,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著永脓,像睡著了一般袍辞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上常摧,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天搅吁,我揣著相機與錄音威创,去河邊找鬼。 笑死谎懦,一個胖子當著我的面吹牛肚豺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播界拦,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼吸申,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了享甸?” 一聲冷哼從身側(cè)響起截碴,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛉威,沒想到半個月后日丹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蚯嫌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年哲虾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齐帚。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡妒牙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出对妄,到底是詐尸還是另有隱情湘今,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布剪菱,位于F島的核電站摩瞎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏孝常。R本人自食惡果不足惜旗们,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望构灸。 院中可真熱鬧上渴,春花似錦、人聲如沸喜颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽半开。三九已至隔披,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寂拆,已是汗流浹背奢米。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工抓韩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鬓长。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓谒拴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痢士。 傳聞我的和親對象是個殘疾皇子彪薛,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容