深入淺出基於物理的渲染一

一、數學基礎

立體角是單位球(半徑為1的球)面上的一塊面積,以觀測點為球心,構造一個單位球面, 任意物體投影到該單位球面上的投影面積,即為該物體相對於該觀測點的立體角。

dw=r d	heta 	imes rsin	hetaphi=sin	heta d	heta dphi ( r = 1 )

如上圖球坐標繫上一點坐標為 left( rsin	heta cosphi, rsin	heta sinphi,rcos	heta
ight)

矢量相對法線的角度 	heta ,稱為極角(Polar Angle)或天頂角(Zenith Angle)

矢量在平面上的投影相對於平面上坐標軸x的角度 phi ,稱為方位角(Azimuthal Angle)

數學上的立體角積分是 int_{Omega}dw=int_{0}^{2pi}int_{0}^{pi}sin	heta d	heta dphi=4pi

但在這裡我們只需要做半球積分, 之後所有的 int_Omega 積分中的 	heta 範圍表示從0到frac{pi}{2} (也有資料用 int_{H} 表示半球積分的)。

下面是兩個常用的立體角積分公式

1. int_{Omega}dw=int_{0}^{2pi}int_{0}^{frac{pi}{2}}sin	heta d	heta dphi

=int_{0}^{2pi}dphiint_{0}^{frac{pi}{2}}sin	heta d	heta

=2pi*(-cos	heta |_{0}^{pi})

=2pi

這裡用了基本積分公式: int_{a}^{b}sin	heta d	heta=-cos	heta |_{a}^{b}=cosa - cosb

2.int_{Omega}cos	heta dw=int_{0}^{2pi}int_{0}^{frac{pi}{2}}cos	heta sin	heta d	heta

=2pi*int_{0}^{frac{pi}{2}}sin	heta (sin	heta)^{} d	heta

=2pi*int_{0}^{frac{pi}{2}}sin	heta dsin	heta

=2pi*frac{sin^{2}	heta}{2}|_{0}^{frac{pi}{2}}

= pi

這裡用到了積分換元法:

int f(x)dx=int f(varphi(x))varphi^{}(x)dx=int f(u)du where u=varphi(x)

二、輻射學

對於輻射學一切物體皆光源,一切光源皆面光源。

輻射通量

輻射通量 Phi (radiant flux)又稱功率, 單位時間內穿過表面或空間區域的全部能量, 單位為瓦特(W, 光學為lm流明)用符號 Phi 表示。 光源的全部發射能量通常用輻射通量表示。下圖顯示了點光源的輻射通量。針對圍繞該光源的虛擬球體,可通過穿過其中的全部能量計算輻射通量。需要注意的是,雖然較大球體的局部穿越能量較小,但兩個球體的全部輻射通量是相同的。

輻射通量公式為: Phi=frac{dQ}{dt}

輻射照度

輻射照度 E (irradiance)是單位面積上接收到的光源輻射通量,也就是輻射通量的密度,照度的單位( frac{W}{m^{2}} ,光學中為lux勒克斯), 用符號 E 表示。

輻射照度公式為: E=frac{dPhi}{dA}

注意: A 不垂直於光線傳輸方向,將 A 投影到垂直於光線方向得到一個虛擬表面 A^ot=Acos	heta , 因為通過這兩個表面的輻射通量 Phi 是相同的,則 A 表面接收到的輻射照度是E = frac{Phi }{A},而虛擬表面 A^ot 上的輻射照度E_L = frac{Phi }{A cos 	heta}

輻射強度

輻射強度 I (intensity) 表示每單位立體角的輻射通量單位 W/sr . 輻射強度描述了光源的方向性分布,但只對點光源才有意義, 因為點光源面積為0,無法使用輻射照度。

輻射強度公式為: I=frac{dΦ}{domega}

輻射亮度

輻射亮度 L (radiance) 光源在每單位立體角和每單位投影面積上的輻射通量,單位 W/m^{2}sr (尼特nit). 表示物體表面沿某一方向的明亮程度。一種理解輻射亮度的簡單方法就是,考察一束激光,它直接射向一個物體表面,來自這個方向併到達物理表面上一個給定點的輻射通量大小就是輻射亮度。

L=frac{d^2Phi}{domega dA^ot}=frac{d^2Phi}{domega*dA*cos	heta}

其中 dA^otdA 在垂直於 omega (入射或出射方向)的假想表面上的投影面積

L = frac{d^2Phi}{domega*dA*cos	heta}=frac{dE_L}{domega cos	heta}Rightarrow dE_L=Lcos	heta domega

從而得到: E_L=int_{Omega}Lcos	heta dw=Lint_{Omega}cos	heta domega=pi L

注意: 有些資料不強調高階微分,使用 dPhi 代替了 d^2Phi

輻射亮度是輻射學中最重要的的量值,在同一透明介質中,沿輻射方向輻射亮度不變,與距離無關。乍一看這個事實很難與想法保持一致,雖然 (分子上)輻射照度隨著距離的平方而下降,然而物理上隨著距離的增加,光源發射表面覆蓋的(分母上)立體角也同樣變小了。擴充: 這裡有一個5倍規則:如果到光源的距離是光源寬度的5倍或者更多,與距離的平方反比定律就是合理的近似[0]。

三、物理光照模型

一般來說,光照的物理模型是計算光線照射到物體表面後,被反射出去的輻射能的模型。光線照射到物體表面後,一部分光能被物體吸收,一部分光能被表面傳導出去,剩餘的能量則被表面反射出去,反射出去的能量通常被散射,而不是都沿同一個方向反射。

雙向反射分布函數

雙向反射分布函數(Bidirectional Reflectance Distribution Function, 簡稱BRDF)構成了表面反射的定義, 描述了光如何在表面進行反射。該問題可描述為:當沿 omega_i 方向的入射輻射亮度為L_i(p,omega_i) 時, 計算朝向觀察者的方向 omega_o 上有多少的輻射亮度離開表面,即 L_o(p,omega_o), 計算輻射亮度就是計算表面一點的顏色。如果我們把方向 omega_i 視為微分方向圓錐,那麼在p點的微分輻射照度是: dE(p,omega_i)=L_i(p,omega_i)cos	heta_i domega_i

因為輻射照度 dE(p,omega_i) 而產生的 omega_o 反射方向上的微分輻射亮度為 dL_o(p,omega_o) ,根據幾何光學的線性假設, 反射的微分輻射亮度 dL_o(p,omega_o) 與入射微分輻射照度 dE(p,omega_i) 成正比,針對特定的一對 omega_oomega_i 方向組合,這個比例就定義了表面的BRDF函數

f_r(p,omega_o,omega_i)=frac{dL_o(p,omega_o)}{dE_i(p,omega_i)}=frac{dL_o(p,omega_o)}{L_i(p,omega_i)cos	heta_idomega_i}

如果是點光源可以用非積分形式表示(會在精確光源章證明)

f_r(p,omega_o,omega_i)=frac{L_o(p,omega_o)}{E_i(p,omega_i)}

注意:這裡 omega_i 代表入射光 l , omega_o 代表出射光 v 。描述一般與配圖一致 ,有些地方會混用這些變數,註: domega_idomega_h 代表他們對應的立體角。

為什麼BRDF要定義成輻射率和輻照度的比值?而不是直接定義為輻射率和輻射率比值

可以參考知乎 brdf為什麼要定義為一個單位是sr-1的量?的回答

餘弦輻射照度計(A)接受平面上半球180°的所有光線,可以測量一個表面上入射(包括漫反射和直接光)光的輻射照度E_i

輻射亮度測量儀(B)相當於A套上一個長筒,控制光線只能從一個很小的立體角進入測量儀,從而將散射的光線切割出來, 可以測量出射方向的輻射亮度L_o

因為入射光線是來自四面八方的,所以很難用輻射亮度測量儀測量入射方向的輻射亮度 L_i

BRDF 表示在特定入射條件下,沿出射方向反射的相對能量。關於這個函數的另外一個理解方式就是:用光子概念來考慮,BRDF給出了入射光子以特定方向離開的概率。

BRDF滿足下面兩個條件:

  1. 交換性 f(omega_i,omega_o)=f(omega_o,omega_i)
  2. 能量守恆 int_{Omega}f(omega_i,omega_o)cos	heta_o domega_oleq1

能量守恆簡單證明:

E_o=int_{Omega}L_ocos	heta_odomega_o

=int_{Omega}f(omega_i,omega_o)E_icos	heta_odomega_o

=E_iint_{Omega}f(omega_i,omega_o)cos	heta_odomega_o

Rightarrowint_{Omega}f(omega_i,omega_o)cos	heta_odomega_o=frac{E_o}{E_i}leq1

不考慮SSS,著色方程可以表示為:

L_o(p,omega_o)=int_{Omega}f(p,omega_o,omega_i) otimes L_i(p,omega_i)cos	heta_idomega_i

使用 otimes 符號(分段向量乘法),是因為BRDF和輻射亮度都是RGB向量

Lambertian漫反射模型

Lambertian反射也稱做完全漫反射。表示各種方向上輻射亮度都一樣的反射面,這是一種理想情況,現實中是不存在完全漫反射的。它與 omega_iomega_o 完全沒有關係,描述它的BRDF方程是:

f_{lambert}(l,v)=frac{c_{diff}}{pi}c_{diff} 是漫反射材質顏色)

漫反射參數 frac{1}{pi} 的推導:

E_{i}=int_{Omega}L_{i}cos	heta_{i}dw_{i}=pi L_{i}

f(l,v) = frac{ L_{o}}{E_{i}}=frac{L_{o}}{pi L_i}=frac{c_{diff}L_{i}}{pi L_i}=frac{c_{diff}}{pi}

也可以按照能量守恆推導, 表面不能反射超過100%的入射光能。

L_{0}leq L_{i}Rightarrow f(l,v)pi L_{i} leq L_{i}Rightarrow f(l,v)pi leq1Rightarrow f(l,v)leqfrac{1}{pi}

高光反射模型Specular BRDF

Microfacet理論

微表面模型理論是一種從非光學平面獲得表面反射BRDF的理論方法。它假設表面都是由很多的微小平面組成,每個微平面的尺度都很小,眼睛看不到,但遠比光波波長要長。每個微平面都可以看成是完美的鏡面,可以將入射光線反射到一個單獨的出射的方向。雖然使用法線貼圖也可以描述表面的細節,但不管如何提升貼圖精度仍然會有一定的缺失,更無法反饋眼睛無法看到的微小細節。相對法線貼圖微表面對反射的影響更多,因為粗糙的微表面會把反射光分散(D項)或者遮擋(G項)

基於以上特點,在UE4(UE在編輯器環境採用GGX,但UE Mobile上採用了歸一化BlinnPhong)中使用法線貼圖時與UDK時代有所不同,在UDK中美術為了表現物體的質感,經常會在製作完法線貼圖後,人為疊加一層雜色,通過這個來控制表面反射高光的範圍和效果。但在PBR中由於物理層面已經模擬了物體的金屬度和粗糙度。不需要添加雜色,轉而使用粗糙度和金屬度貼圖來控制,對於高光項的BRDF方程是:

f(l,v)=frac{F(l,h)G(l,v,h)D(h)}{4(ncdot l)(ncdot v)}

Fresnel因子

在物理方面需要考慮的一個重要因素是 Fresnel反射(一般在BlinnPhong模型中並沒有考慮這個),它對像塑料、玻璃以及水這樣的不導電物質(絕緣體)來說特別重要。當從很小的掠射角方向來觀察這些絕緣體的時候, 反射會比較強。相比之下, 金屬材質的反射強弱與角度關係不大。在最小的掠射角(Grazing angle)處, 所有的材質都會變成完全反射, 也就是說特定的角度上,任何錶面光滑的物質都可以成為完美鏡面。

如上圖,越接近邊緣區域,如橙色圈內,也就是入射角為90度時,反射率無限趨近於100%。而在入射角接近0度時(藍色圈)的反射率接近物體本身的值

如上圖當入射角為0時,非金屬反射率為0.02-0.2,金屬則高達0.5-1.0,並且隨入射角變大,金屬反射率變化很小。

對於絕緣體光會在內部進行吸收和散射活動,一些折射光會通過散射,重新從入射平面反方向射出去。 例如, 塑料有一個白色基層, 在這個基層中通常有一些色素顆粒,鏡面反射出來的光線通常保持白色, 原因是它並沒有穿過這個材質,而來自這個材質的漫反射光則穿過了這個材質並與其中的色素相互作用。

金屬可以導電,所以一些電磁波可以激活其中的電子,而激活的電子又會使這些電磁波產生反射。這種特點就導致鏡面高光用到了表面顏色,同時也減少了漫反射分量, 因為折射進表面的光線的能量會立即被金屬中的自由電子吸收,轉換成電子的能量,因此金屬會吸收掉所有的折射光,很少會有光線在金屬表面內部進行反射,特別是光滑的金屬基本上沒有漫反射顏色,金屬通常的反射率高達60%~90%,而絕緣體則只有0%~20%,反射率高防止了入射光被吸收或折射,這樣金屬就有了閃亮的外觀。

Fresnel 公式

之下涉及到的 a = roughness^2 , F_0 表示高光顏色

F_{Schlick}(F_{0}, l, h) = F_{0}+(1-F_{0})(1-vcdot h)^{5} [SCHLICK94]

F_{CookTorrance}(V,h)=frac{1}{2}frac{(g-c)^2}{(g+c)^2}left( 1+frac{(c(g+c)-1)^2}{(c(g-c)+1)^2}) 
ight)

where

eta=frac{1+sqrt{F_0}}{1-sqrt{F_0}}c=vcdot hg=sqrt{eta^2+c^2-1}

微平面分布函數

D(h) 是微表面上的法線分布函數(Normal Distribution Function)NDF, 描述了單位宏表面上微表面法線為 h 的概率密度,即微表面法向量 m 與向量 h 相同的比例,在大多數表面上,微表面的方向不是均勻分布的。 微表面法線接近宏表面法線的頻率越高就越光滑。

D 決定了高光的大小、亮度,形狀和衰減速度等等,出現在圖形文獻中的法線分布函數都是類似高斯分布形式,具有某種「粗糙度」或方差參數。隨著表面粗糙度的降低,在整個宏表面法線 n 周圍的微表面法線 m 密度增加,並且 D(h) 的值可能變得非常高[8]

微表面投影到幾何體法線 omega_h 上的歸一化面積為:

int_{Omega}D(h)(ncdot h)domega_h=1

可以簡單理解為在宏表面法線方向投影面積和幾何體面積的比例為1,給定一個以 h 為中心的無限小立體角,和無限小的宏表面面積 dAD(h)domega_hdA 表示法線位於該立體角內的微面的總面積。即 dA_h=D(h)domega_hdA 。而 dA=(ncdot h)dA_h frac{1}{A}int(ncdot h)dA_h=int_{Omega}D(h)(ncdot h)domega_h=1

換一種形式說明,對於任何的 v 方向,微表面與宏表面在 v 方向上的投影面積是相同的[5]:

vcdot n=int_{Omega}D(h)(vcdot h)domega_h

v=n 時是一種特殊情況, 公式也成立:

int_{Omega}D(h)(ncdot h)domega_h=1

對於以前使用的BlinnPhong 高光項,可以認為D(h)=(ncdot h)^n=cos^n	heta ,那麼根據歸一化條件可得:

int_{Omega}D(h)cos	heta domega

=int_{0}^{2pi}int_{0}^frac{pi}{2}cos^n	heta cos	heta sin	heta d	heta dphi

=2pi*int_{0}^{frac{pi}{2}}-cos^{n+1}	heta dcos	heta

=2pi*frac{-cos^{n+2}	heta}{n+2}|_{0}^{frac{pi}{2}}

=frac{2pi}{n+2}

為了讓此等式滿足歸一化條件, D(h) 必須乘上 frac{n+2}{2pi} , 所以歸一化BlinnPhong的微表面分布函數應該是: D_{phong}(h)=frac{n+2}{2pi}(ncdot h)^n 的形式

這裡補充下,UE Mobile環境使用的D項,對歸一化Blinn-Phong做了球形高斯近似

D_{Blinn}(h)=frac{1}{pialpha^2}(ncdot h)^{(frac{2}{alpha^2}-2)}approx=frac{1}{pialpha^2}(rcdot l)^{(frac{2}{alpha^2}-2)}

r=2(ncdot v)n-v

按球形高斯近似公式 x^{n}approx e^{(n+0.775)(x-1)} 和對數換底公式 log_{a}^{e} = frac{1}{log_{e}^{a}}=frac{1}{lna}

 2^{frac{x}{ln2}}= (2^{frac{1}{ln2}})^x=(2^{log_{2}^{e}})^{x} =e^x

x^{n}approx e^{(n+0.775)(x-1)}=2^{frac{(n+0.775)(x-1)}{ln2}}

(rcdot l)^{frac{1}{2a^{2}}-frac{1}{2}}=e^{(frac{1}{2a^2}+0.275)(rcdot l-1)}

=2^{(frac{(frac{1}{2a^2}+0.275)rcdot l - (frac{1}{2a^2}+0.275)}{ln2}}=2 ^{(frac{0.72134752}{a^2}+0.39674113)rcdot l-frac{0.72134752}{a^2}+0.39674113)}

對於現代GPU作用不大,主要對於PS3,XBOX360是個優化

Distribution 公式

之下涉及到的 a = roughness^2

D_{phong}(h)=frac{a_p+2}{2pi}(ncdot h)^{a_p} where a_p=frac{2}{a^2}-2

最終為: D_{Phong}(h)=frac{1}{pialpha^2}(ncdot h)^{(frac{2}{alpha^2}-2)}

D_{GGX}(h)=frac{a^2}{pi ((ncdot h)^2(a^2-1)+1)^2}

D_{Beckmann}(h)=frac{1}{pi a^2(ncdot h)^4}e^left( frac{(ncdot h)^2-1}{a^2(ncdot h)^2} 
ight)

D_{GGX_{aniso}}(h)=frac{1}{pi a_xa_y}frac{1}{left(frac{(xcdot h)^2}{a_x^2}+frac{(ycdot h)^2}{a_y^2} + (ncdot h)^2
ight)^2}

從2013年開始,不少次世代遊戲開始換上了全新的NDF模型GGX,也稱為Trowbridge-Reitz。GGX最大的特點在於,從高光中心處,相比BlinnPhong更快衰減,但是在遠離高光中心後,高光衰減比BlinnPhong的衰減要慢得多,這使得GGX的高光遠比BlinnPhong要狹長。GGX的高光有條長長的「尾巴」,這一點非常符合現實情況。尤其對於較為粗糙的材質,GGX的高光有非常柔和的衰減,使得Blinn-Phong時代「油膩膩」的材質現象大幅減少。

幾何衰減因子

照向一個微平面的光線可能被相鄰的微平面阻斷,而照不到該微平面。

微平面的反射光線也可能被相鄰的微平面阻斷而反射不出來。

因為有這種現象,所以需要有一個Geometry項G,來代表反射光的可見度。遮擋項在某種程度上抵消了microfacet方程中的分母 (n cdot l)(ncdot v) ,經常會和其他參數合併成為V項

Geometry 公式:

G_{Newmann}(l,v,h)=frac{(ncdot l)(ncdot v)}{max(ncdot l, ncdot v)}

G_{Cook-Torrance}(l,v,h)=minleft( 1,frac{2(ncdot h)(ncdot v)}{vcdot h},frac{2(ncdot h)(ncdot l)}{vcdot h} 
ight)

G_{Kelemen}(l,v,h)=frac{(ncdot l)(ncdot v)}{(vcdot h)^2}

下面的幾何衰減模型使用Smith的方法[9]。Smith將G分解為兩部分:一次用參數(l,h),一次用(v,h),Smith公式可表示為:

G_{smith}(l,v,h)=G(l,h)G(v,h)

下面的方程中, 變數 i 是佔位符,最終用變數l或者v替換

G_{ggx}=frac{2cos	heta_i}{cos	heta_i+sqrt{cos^2	heta_i+a^2(1-cos^2	heta_i)}}

G_{schlick}(i,h)=frac{cos	heta_{i}}{cos	heta_i(1-k)+k}

where k=asqrt{frac{2}{pi}} , UE[2] 中用了 k=frac{a}{2}

按照Smith近似公式,最終結果是:

G_{GGX}(l,v,h)=frac{4(ncdot l)(ncdot v)}{(ncdot l+sqrt{(ncdot l)^2+a^2(1-(ncdot l)^2)})(ncdot v+sqrt{(ncdot v)^2+a^2(1-(ncdot v)^2)})}

G_{Schlick}(l,v,h)=frac{(ncdot l)(ncdot v)}{((ncdot l)(1-k)+k)*((ncdot v)(1-k)+k)}

GGX一般使用Eric Heitz [1]提供的Smith近似公式, UE和Unity都用下面這個公式:

G_{GGX}(l,v,h)=frac{2(ncdot l)(ncdot v)}{(ncdot l)*((ncdot v)*(1-a)+a)+((ncdot v))*((ncdot l)*(1-a)+a)}

注: V = frac{G}{4*(n cdot l)(ncdot v)}

由於字數限制,先到這裡,內容可能會不斷修改,謝絕轉載。

參考文獻:

[0]TomasAkenine-M?ller, Real-Time Rendering

[1]Eric Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"

[2]Brian Karis, Specular BRDF Reference

[3]Trent, Physically Based Shading and Image Based Lighting

[4]Matt Pharr, Physically Based Rendering From Theory to Implementation

[5]Bruce Walter等, Microfacet Models for Refraction through Rough Surfaces

[6]Jack W. Bradbury等,Animal Communication: Web Topic 4.2

[7]Nathan Reed, How Is The NDF Really Defined?

[8]Naty Hoffman, Physically-Based Shading Models in Film and Game Production

[9]B Smith, Geometrical Shadowing of a Random Rough Surface

[10]ShaderDog, 遊戲中基於物理的渲染簡簡明科普(2):微平面理論


推薦閱讀:

圖靈宇宙漫遊指南
Procedure Cloud
【GPU精粹與Shader編程】(一) 開篇 & 全系列11本書核心知識點總覽
計算機圖形學常用術語整理
GAN在2017年實現四大突破,未來可能對計算機圖形學產生衝擊

TAG:實時渲染 | 計算機圖形學 | 遊戲開發 |