PBR:基於物理的渲染(Physically Based Rendering)+理論相關


一: 關於能量守恆

  1. 出射光線的能量永遠不能超過入射光線的能量(發光面除外)。如圖示我們可以看到,隨着粗糙度的上升鏡面反射區域的會增加,但是鏡面反射的亮度卻會下降。如果不管反射輪廓的大小而讓每個像素的鏡面反射強度(Specular Intensity)都一樣的話,那么粗糙的平面就會放射出過多的能量,而這樣就違背了能量守恆定律。這也就是為什么正如我們看到的一樣,光滑平面的鏡面反射更強烈而粗糙平面的反射更昏暗。
  2. 當一束光線碰撞到一個表面的時候,它就會分離成一個折射部分和一個反射部分。反射部分就是會直接反射開來而不會進入平面的那部分光線,這就是我們所說的鏡面光照。而折射部分就是余下的會進入表面並被吸收的那部分光線,這也就是我們所說的漫反射光照。
  3. 通過物理學我們可以得知,光線實際上可以被認為是一束沒有耗盡就不停向前運動的能量,而光束是通過碰撞的方式來消耗能量。每一種材料都是由無數微小的粒子所組成,這些粒子都能如下圖所示一樣與光線發生碰撞。這些粒子在每次的碰撞中都可以吸收光線所攜帶的一部分或者是全部的能量而后轉變成為熱量。
  4. 一般來說,並非所有能量都會被全部吸收,而光線也會繼續沿着(基本上)隨機的方向發散,然后再和其他的粒子碰撞直至能量完全耗盡或者再次離開這個表面。而光線脫離物體表面后將會協同構成該表面的(漫反射)顏色。
  5. 而有一些被稱為次表面散射(Subsurface Scattering)技術的着色器技術將這個問題考慮了進去,它們顯著的提升了一些諸如皮膚,大理石或者蠟質這樣材質的視覺效果,不過伴隨而來的則是性能下降代價。
  6. 反射光與折射光之間的這個區別使我們得到了另一條關於能量守恆的經驗結論:反射光與折射光它們二者之間是互斥的關系。無論何種光線,其被材質表面所反射的能量將無法再被材質吸收。因此,諸如折射光這樣的余下的進入表面之中的能量正好就是我們計算完反射之后余下的能量。

二:關於輻射度量學

  1. 輻射度量學是一種用來度量電磁場輻射(包括可見光)的手段。有很多種輻射度量(radiometric quantities)可以用來測量曲面或者某個方向上的光。
  2. 立體角: 立體角用ω表示,它可以為我們描述投射到單位球體上的一個截面的大小或者面積。投射到這個單位球體上的截面的面積就被稱為立體角(Solid Angle),你可以把立體角想象成為一個帶有體積的方向。
    • 圖1
    • 可以把自己想象成為一個站在單位球面的中心的觀察者,向着投影的方向看。這個投影輪廓的大小就是立體角。
  3. 基本概念:
    • 輻射能量: radiant energy.用Q表示:Q = hv,其中 h 為普朗克常數 6.62620×10−34J · s,v表示頻率
    • 輻射通量: radiant flux,用Φ表示:表⽰光源每秒鍾發射的功率(dΦ/dt),其單位為⽡特 W。
      • 光是由多種不同波長的能量所集合而成的,而每種波長則與一種特定的(可見的)顏色相關。因此一個光源所放射出來的能量可以被視作這個光源包含的所有各種波長的一個函數。
      • 波長介於390nm到700nm(納米)的光被認為是處於可見光光譜中,也就是說它們是人眼可見的波長。
      • 輻射通量將會計算這個由不同波長構成的函數的總面積。直接將這種對不同波長的計量作為參數輸入計算機圖形有一些不切實際,因此我們通常不直接使用波長的強度而是使用三原色編碼,也就是RGB(或者按通常的稱呼:光色)來作為輻射通量表示的簡化。這套編碼確實會帶來一些信息上的損失,但是這對於視覺效果上的影響基本可以忽略。
    • 輻射強度: radiant intensity,用I表示;I 也是⼀個與距離⽆關的量.
      • 在不同的⽅向上具有不同輻射強度。
      • 輻射強度(Radiant Intensity)表示的是在單位球面上,一個光源向每單位立體角所投送的輻射通量。
      • 舉例來說,假設一個全向光源向所有方向均勻的輻射能量,輻射強度就能幫我們計算出它在一個單位面積(立體角)內的能量大小:
      • 圖片2
      • 計算輻射強度的公式如下所示:\(I = \frac{d\Phi}{d\omega}\)。其中I表示輻射通量Φ除以立體角ω。
    • 輻射亮度:(也叫輻射率) radiance,用L表示;表⽰的是某個點在某個⽅向上的亮度,在計算機圖形學中它是⼀束光的亮度,
      • 是光照⽅程最終要計算量。且L 的值不隨距離發射點距離的變化⽽變化。
      • 一個擁有輻射強度Φ的光源在單位面積A,單位立體角ω上的輻射出的總能量(輻射率方程):\(L=\frac{d^2\Phi}{ dA d\omega \cos\theta}\)
      • 輻射率是輻射度量學上表示一個區域平面上光線總量的物理量,它受到入射(Incident)(或者來射)光線與平面法線間的夾角θ的余弦值cosθ的影響:當直接輻射到平面上的程度越低時,光線就越弱,而當光線完全垂直於平面時強度最高。
      • 其中cosθ就直接對應於光線的方向向量和平面法向量的點積.
      • 輻射率方程很有用,因為它把大部分我們感興趣的物理量都包含了進去。如果我們把立體角ω和面積A看作是無窮小的,那么我們就能用輻射率來表示單束光線穿過空間中的一個點的通量。
      • 這就使我們可以計算得出作用於單個(片段)點上的單束光線的輻射率,我們實際上把立體角ω轉變為方向向量ω然后把面A轉換為點p。這樣我們就能直接在我們的着色器中使用輻射率來計算單束光線對每個片段的作用了。
    • 輻射照度(輻照度): irradiance,用E表示;它是點 (ξ, η) 沿各個⽅向對輻射亮度 L 的積分。
      • ⼀個⾯上某點接收來⾃各個⽅向的輻射亮度形成輻射照度。
      • 事實上,當涉及到輻射率時,我們通常關心的是所有投射到點p上的光線的總和,而這個和就稱為輻射照度或者輻照度(Irradiance)。

二: 關於反射率方程:

  1. \(L_o(p,\omega_o) = \int\limits_{\Omega} f_r(p,\omega_i,\omega_o) L_i(p,\omega_i) n \cdot \omega_i d\omega_i\)
  2. 我們知道在渲染方程中L代表通過某個無限小的立體角ωi在某個點上的輻射率,而立體角可以視作是入射方向向量ωi。
  3. 注意我們利用光線和平面間的入射角的余弦值cosθ來計算能量,亦即從輻射率公式L轉化至反射率公式時的n⋅ωi。
  4. 用ωo表示觀察方向,也就是出射方向,反射率公式計算了點p在ωo方向上被反射出來的輻射率Lo(p,ωo)的總和。或者換句話說:Lo表示了從ωo方向上觀察,光線投射到點p上反射出來的輻照度。
  5. 基於反射率公式是圍繞所有入射輻射率的總和,也就是輻照度來計算的,所以我們需要計算的就不只是是單一的一個方向上的入射光,而是一個以點p為球心的半球領域Ω內所有方向上的入射光。
  6. 一個半球領域(Hemisphere)可以描述為以平面法線n為軸所環繞的半個球體:
  7. 為了計算某些面積的值,或者像是在半球領域的問題中計算某一個體積的時候我們會需要用到一種稱為積分(Integral)的數學手段,也就是反射率公式中的符號∫,它的運算包含了半球領域Ω內所有入射方向上的dωi 。
  8. 積分運算的值等於一個函數曲線的面積,它的計算結果要么是解析解要么就是數值解。由於渲染方程和反射率方程都沒有解析解,我們將會用離散的方法來求得這個積分的數值解。
  9. 這個問題就轉化為,在半球領域Ω中按一定的步長將反射率方程分散求解,然后再按照步長大小將所得到的結果平均化。這種方法被稱為黎曼和(Riemann sum) 。
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;
} ```
   10. 通過利用dW來對所有離散部分進行縮放,其和最后就等於積分函數的總面積或者總體積。這個用來對每個離散步長進行縮放的dW可以認為就是反射率方程中的dωi 。在數學上,用來計算積分的dωi 表示的是一個連續的符號,而我們使用的dW在代碼中和它並沒有直接的聯系(因為它代表的是黎曼和中的離散步長),這樣說是為了可以幫助你理解。
   11. 請牢記,使用離散步長得到的是函數總面積的一個近似值。細心的讀者可能已經注意到了,我們可以通過增加離散部分的數量來提高黎曼和的准確度(Accuracy)。
   12. ***反射率方程概括了在半球領域Ω內,碰撞到了點p上的所有入射方向ωi 上的光線的輻射率,並受到fr的約束,然后返回觀察方向上反射光的Lo。***
   13. 正如我們所熟悉的那樣,入射光輻射率可以由光源處獲得,此外還可以利用一個環境貼圖來測算所有入射方向上的輻射率,我們將在未來的IBL教程中討論這個方法。
   14. 現在唯一剩下的未知符號就是fr(也叫做S)了,它被稱為BRDF,或者雙向反射分布函數(Bidirectional Reflective Distribution Function) ,***它的作用是基於表面材質屬性來對入射輻射率進行縮放或者加權。***

三:**關於雙向反射分布函數(BRDF):**
   1. 函數由2個⽅向組成,具有4個變量,它本質上指明了每個⽅向的⼊射光在各個⽅向上的反射光分布。
   2. BRDF,或者說雙向反射分布函數,它接受入射(光)方向ωi,出射(觀察)方向ωo,平面法線n以及一個用來表示微平面粗糙程度的參數a作為函數的輸入參數。BRDF可以近似的求出每束光線對一個給定了材質屬性的平面上最終反射出來的光線所作出的貢獻程度。
   3. 舉例來說,如果一個平面擁有完全光滑的表面(比如鏡面),那么對於所有的入射光線ωi(除了一束以外)而言BRDF函數都會返回0.0 ,只有一束與出射光線ωo擁有相同(被反射)角度的光線會得到1.0這個返回值。
   4. BRDF基於我們之前所探討過的微平面理論來近似的求得材質的反射與折射屬性。對於一個BRDF,為了實現物理學上的可信度,它必須遵守能量守恆定律,也就是說反射光線的總和永遠不能超過入射光線的總量。嚴格上來說,同樣采用ωi和ωo作為輸入參數的 Blinn-Phong光照模型也被認為是一個BRDF。然而由於Blinn-Phong模型並沒有遵循能量守恆定律,因此它不被認為是基於物理的渲染。
   5. 現在已經有很好幾種BRDF都能近似的得出物體表面對於光的反應,但是幾乎所有實時渲染管線使用的都是一種被稱為Cook-Torrance BRDF模型。Cook-Torrance BRDF兼有漫反射和鏡面反射兩個部分:$f_r = k_d f_{lambert} +  k_s f_{cook-torrance}$
   6. 這里的kd是早先提到過的入射光線中被折射部分的能量所占的比率,而ks是被反射部分的比率。BRDF的左側表示的是漫反射部分,這里用flambert來表示。它被稱為Lambertian漫反射,這和我們之前在漫反射着色中使用的常數因子類似,用如下的公式來表示:$f_{lambert} = \frac{c}{\pi}$
   7. c 表示表面顏色(回想一下漫反射表面紋理)。除以π是為了對漫反射光進行標准化,因為前面含有BRDF的積分方程是受π影響的(我們會在IBL的教程中探討這個問題的)。
   8. ***這個Lambertian漫反射和我們之前經常使用的漫反射到底有什么關系:之前我們是用表面法向量與光照方向向量進行點乘,然后再將結果與平面顏色相乘得到漫反射參數。點乘依然還在,但是卻不在BRDF之內,而是轉變成為了Lo積分末公式末尾處的n⋅ωi 。***
   9. BRDF的鏡面反射部分要稍微更高級一些,它的形式如下所示:$f_{cook-torrance} = \frac{DFG}{4(\omega_o \cdot n)(\omega_i \cdot n)}$
   10. Cook-Torrance BRDF的鏡面反射部分包含三個函數,此外分母部分還有一個標准化因子 。字母D,F與G分別代表着一種類型的函數,各個函數分別用來近似的計算出表面反射特性的一個特定部分。**三個函數分別為正態分布函數(Normal Distribution Function),菲涅爾方程(Fresnel Rquation)和幾何函數(Geometry Function).**
      * 正態分布函數:估算在受到表面粗糙度的影響下,取向方向與中間向量一致的微平面的數量。這是用來估算微平面的主要函數。
      * 幾何函數:描述了微平面自成陰影的屬性。當一個平面相對比較粗糙的時候,平面表面上的微平面有可能擋住其他的微平面從而減少表面所反射的光線。
      * 菲涅爾方程:***菲涅爾方程描述的是在不同的表面角下表面所反射的光線所占的比率。***
   11. 以上的每一種函數都是用來估算相應的物理參數的,而且你會發現用來實現相應物理機制的每種函數都有不止一種形式。它們有的非常真實,有的則性能高效。你可以按照自己的需求任意選擇自己想要的函數的實現方法。

四: 正態分布函數

五: 幾何函數

六: 菲涅爾方程

七: Cook-Torrance反射率方程
   1. 隨着Cook-Torrance BRDF中所有元素都介紹完畢,我們現在可以將基於物理的BRDF納入到最終的反射率方程當中去了:$L_o(p,\omega_o) = \int\limits_{\Omega} (k_d\frac{c}{\pi} + k_s\frac{DFG}{4(\omega_o \cdot n)(\omega_i \cdot n)})L_i(p,\omega_i) n \cdot \omega_i  d\omega_i$
   2. 這個方程現在完整的描述了一個基於物理的渲染模型,它現在可以認為就是我們一般意義上理解的基於物理的渲染也就是PBR。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM