2020年3月30日 星期一

淺談 physically based rendering (4)


  • 前言

在上一個章節提到, physically based rendering 所帶來的最大的效果就是在於 Specuar 的

部分,本章節將簡單的介紹 Specuar BRDF 的內容。

就如同本系列的第一篇所言,這篇文章是希望能夠快速簡單的理解 physically based rendering

而不用去理解複雜的數學關係。因此,文章內我會審略很多數學的證明,犧牲了正確性和廣

泛性的分析。對於想要有更深入的理解的人建議可以去參考其他人的文章。


  • Specuar BRDF
回顧 淺談 physically based rendering (2) 的內容,我們將焦點放在 Specular BRDF 的部分。


其中:

frs 是 Specular BRDF

Fθ 是與法線夾角θ的入射光的反射率

Li 是入射光

現在最被用來實作 frs 的演算法就是 Cook-Torrance Model。

(註1)(註2)

這個模型是由 60 年代後半所提出的 Torrance-Sparrow Model [1],經過 Blinm [2]整理後,

才成了今天這樣的結果[3]。

現在大部分的 physically based rendering,都是使用 Cook-Torrance Model 來實作。

因此,本篇文章也以 Cook-Torrance Model 作為說明與實作的模型。


  • Microfacet Model (微小面模型)

再繼續討論 Cook-Torrance Model 之前,要先說明什麼是 Microfacet 。

當我們拿顯微鏡放大物體表面,會根據物體的物理特性,

可能是個充滿坑洞而非一個平滑的表面。

這個被我們放大的表面就叫做 Microfacet ,

用來模擬 Microfacet 形狀的演算法就叫做 Microfacet Model。

Microfacet 和 Specular 有什麼關係?

當光射到一個平滑的平面時,

他的入射角就會等於反射角,光的能量就會集中。

反之,當光射到一個粗糙的表面時,


他的入射角就不一定等於反射角,光的能量就會被分散。

因此,物體表面的粗糙度會影響到 Specular 的結果。


回想上一章提到我會使用 metallic-roughness 作為 physically based rendering 架構。

這個架構就是使用 Roughness (粗糙度) 作為 Microfacet Model 的引數,

來模擬物體表面的形狀。

  • Roughness
Roughness 的計算方式有很多種,

在這裡我採用發表在 Siggraph2012 Physically Based Shading at Disney的演講內容

所提到的作法。

該演講是提到將 Roughness 作為一個 [0,1] 之間的值,利用這個值來控制物體表面的粗糙度。

但在實際使用時,美術人員反映 Roughness 變化和反映的結果仍有落差,

因此,最後提出了這個方程式


由美術人員去控制這個 [0,1] 之間的 Roughness ,

實際上使用 α 去做 Microfacet Model 的計算。

為了區別兩個之間的參數。

美術人員控制的 Roughness  又叫做 perceptual roughness (直覺粗糙度)

實際運算的 α 又叫做 alpha  roughness。

  • Cook-Torrance Model

繞了一段路,終於回到了主題。


觀察 Cook-Torrance Model ,可以發現一些陌生的參數 D、G 和 F。

這三個參數分別代表

D : Microfacet Distribution Functions (微小面分布函式,簡稱 D-term)

G : Masking-Shadowing Functions (遮蔽-陰影函式,簡稱 G-term)

F : Fresnel (菲涅耳方程式,簡稱 F-term)

接下來會針對這三個參數做討論。


  • Microfacet Distribution Functions


又稱做 Normal Distribution Functions 。

在 Lighting 計算上,法線是重要的項目,Microfacet 也是一樣。

Microfacet Distribution Functions 就是計算 Microfacet 上的法線分布。


目前有許多計算 Microfacet Distribution Functions 的演算法,

在 Cook-Torrance[3] 的論文裡,使用 Beckmann distribution[4],



但目前主流是以 GGX,

GGX 是由 Trowbridge, Retiz 在 1975年推導出 Distribution Functions [5],

之後再 Walter 的論文 [6] 將分布獨立並取名為 GGX。

因此,GGX 又被稱作 Trowbridge-Reitz model。

演算法如下


其中:

h : half-vector

α : alpha roughness

n : normal-vector



GGX 被廣泛使用的原因在於其可以用不是很昂貴的計算 Cost ,

將 Specular lobe 維持成相當長的尾巴型。



資料來源: Learn OpenGL 



左:GGX,右:Normalized BlinnPhong

上面是 GGX 和 Unity 5.0 前使用的 Normalized BlinnPhong 的比較,

可以看得出 GGX 比起 Normalized BlinnPhong ,

中央的能量不會那麼快發散,且兩旁的收斂可以拉得很長。



  • Masking-Shadowing Functions
又稱做 Geometry Attenuation Factor (幾何衰減項)。

是考慮到在 Microfacet 上,根據光源和眼睛的位置而發生的遮蔽現象。


當光線的反射被 Microfacet  遮蔽,稱之為 masking



當光線被 Microfacet  遮蔽,稱之為 shadowing



這個 Geometry Attenuation Factor 是從物理學的分野 [7] 所引用而來,通常稱作 Smith Model,

在電腦圖學領域,通常會將  masking 和 shadowing 分別計算,

然後利用乘法作為結果的近似值。 這個作法稱作 Separable Masking and Shadowing 。



 G1 稱作 Smith Masking Function。

在 G實作上,通常會使用 Schlick 提出的演算法 [8] 去求得近似值。



α 為 alpha roughness。


  • Fresnel 

法國的物理學家 Augustin-Jean Fresnel 提出了光入射到介面時,反射和折射的關係式。

因此反射率又稱之為 Fresnel coefficients。

在這裡的F項是計算當和入射物體的法線夾角 為 θ 的反射率。

在上一章已經提到 Fθ 可用 Schlick's approximation 去求得。

在這裡也是使用 Schlick's approximation 。

只是回頭看看在本章節一開始提到的 Specular BRDF 的整個片段。



發現 Cook-Torrance Model 已經將 Fθ 包含進去,

因此使用 Cook-Torrance Model  作為 Specular BRDF 時,要記得不要重複計算 Fθ 



  • 總結
比照上一章,我同樣的用 Unity3D 寫了一個只針對直接光(太陽光)的 

physically based rendering,

整合了上一章提到的 Diffuse BRDF 和 本章提到的 Specular BRDF。



到了這裡,已經初步的介紹並實作一個單一光源的 physically based rendering。

但是回頭看 淺談 physically based rendering (1) 所提到的 rendering equation




我忽略計算其他方向的光源,因此這個 shader 並不完整。

下一個章節會討論如何實作間接光的計算。







[4] Petr Beckmann, André Spizzichino, The scattering of electromagnetic waves from rough surfaces, Pergamon Press, 1963, 503 pp (Republished by Artech House, 1987

[5] Trowbridge, T. S., and K. P. Reitz, "Average Irregularity Representation of a Roughened Surface for Ray Reflection," Journal of the Optical Society of America, vol. 65, no. 5, pp. 531-536, May 1975.

[6] Walter et al. 2007, "Microfacet Models for Refraction through Rough Surfaces"

[7] [SMITH, B. 1967] Geometrical shadowing of a random rough surface. IEEE Trans. on Antennas and Propagation 15, 668–671.

[8] Christophe Schlick, "An Inexpensive BRDF Model for Physically based Rendering", 1994



  • 附註
1. 在 Walter [6] 的論文裡,對 Specular BRDF 的定義為

    但在 Cook-Torrance [3] 的論文裡,對 Specular BRDF 的定義為

 
   兩者的差別只在於分母是除以 4 還是除以 π ,兩者在論文內都有敘述使用原因。

   但因為 Walter 是延伸 Cook-Torrance Model,因此也被歸類成 Cook-Torrance Model。

   由於 Walter 在發表模型時使用了 GGX 這個詞,

   因此 Walter 的 BRDF 模型又被稱作 GGX BRDF。

   至於要使用哪一個並沒有一定的答案,最好還是根據 D、G、F 項所引用的論文內容

   來決定使用哪一個。


2.在某些論文,可能會發現 Cook-Torrance Model 使用以下的算式來表示



  V 是把 G-term 和分母整合再一起,這個作用是可以減少計算。

  我們觀察本章提到利用 Schlick's approximation 求得的 Geometry Attenuation Factor。



發現在 G-term 內使用到 n.l 和 n.v 作為分母,因此將 G-term 的分母和外面的分子合併,

 可以減少計算數量。






2020年3月23日 星期一

淺談 physically based rendering (3)


  • 前言


前兩篇對 physically based rendering 進行了簡單的說明,

本篇開始正式深入探討 BRDF 的內容。

BRDF 如上篇說言,分成 Diffuse BRDF(擴散反射) 和 Specular BRDF(鏡面反射)。

本章節將專注討論 Diffuse BRDF。



  • Diffuse 反射
回顧一下上一章整理出的單一光源的反射光模型,我們將焦點放在 Diffuse反射部分。


首先,我們會遇到的問題是如何指定 F0 。(Fθ 可用 Schlick's approximation 去求得)

F0 的值是根據物質本身的物理反射率,

但事實上,要針對每個渲染物體去查出正確的反射率是一件不簡單的事。

對於遊戲研發人員來說,希望有一個簡單的規則可以取得每個物體的反射率近似值。

因此在實作上分為兩種做法 :  

  1. metallic-roughness (又稱metallic workflow)
  2. specular-glossiness (又稱specular workflow)
在這系列的所有文章,我都會以 metallic-roughness 架構去說明與實作。

(著名的 Disney Principled BRDF [1] 也是使用 metallic-roughness)。

  • metallic (金屬度)
根據[1],metallic 代表物體的反射能力,其值範圍在 [0,1]。

反射能力越高,則鏡面反射越強,擴散反射越弱。

這個設定正好可以將物體區分成 :

dielectric(導電體,ex.水、油 ... 泛指粒子可通過的物體,metallic = 0)  和 
insulator(絕緣體,ex.鑽石、石英 ... 泛指粒子不可通過的物體,metallic = 1) 。

由於這兩個物理特性由於無法並存(除非不同物質混合,ex.生鏽),

因此,metallic 的值只有 0 和 1。 

所以,可以利用 metallic 來判斷

Diffuse 反射(通過物體內部在反射出去) 和 
Specular 反射(不通過物體內部,直接在表面反射)

的強度比例 (i.e. F0)。


  • F的近似值
F的近似值計算,目前參考的文獻[1][2][3]發現各個做法均有不同。

在本篇文章,我以 Unity3D 的作法為範例,進行說明與實作。


  • Unity3D 的 F0 近似值
還記得上一章提到的垂直反射率的演算法嗎?


垂直反射率是根據兩個 Material 的折射率來求得。

資料來源 wikipedia

Unity3D 觀察所有 Material 的折射率發現,

對於一般的 dielectric,Material 的折射率範圍在 1.3 ~ 1.7 之間。

因此,取平均值 1.5,計算從 Vacuum(真空) 到 dielectric 的平均反射率 F0,

F0 = (1-1.5)^2 / (1+1.5)^2 = 0.04

套用 metallic , F0 近似值的計算公式為

F0 = lerp(0.04, 1, metallic)


  • Diffuse BRDF
到了這裡,終於進入了核心部分 Diffuse BRDF。

參考文獻,發現目前常被使用的 Diffuse BRDF 有 

Normalized Lambert、Oren Nayar BRDF[4]、Disney (Burley) diffuse BRDF[1][註1]。

在這裡,我採用 Normalized Lambert 作為 Diffuse BRDF。

採用的理由有:

  1. 根據效能考量,Lambert 的計算是非常輕量且適用於 real-time
  2. diffuse 的效果沒有 specular 來的明顯,與其使用複雜的計算來加強 diffuse,不如加強 specular 的效果來的理智。

事實上,Unity3D 和 Unreal4[註2] 也是使用 Lambert 作為 Diffuse BRDF。


  • Normalized Lambert
將 Lambert 光照模型正規化使其符合能量守恆,就叫做 normalized Lambert。

Lambert 演算法如下:


其中, C 是渲染物體的顏色。

再來比較本章節一開始提到的 Diffuse 反射模型


可以發現 cos 項和入射光 Li 已經重複。

因此我們只要考慮如何物體顏色 C 和 Diffuse BRDF (frd) 的關係 。


我們回想最早提到的入射點 x,將 x 點放大會變成一個平面,

光的反射方向會涵蓋整個半球(因為從任何角度看點 x 都看的到顏色)。


因此,我們必須要將所有的反射光能量總和等於入射光能量,才能說是滿足能量守恆。

根據 Lambert's cosine law ,每個極小 steradian (立體角)間的反射光是 cosθ 比例。



資料來源 wikipedia

因此,對 cosθ 做半球積分就等於反射光的總合。


中間證明的過程我就省略了,積分的結果為 π

因此 Lambert 的 BRDF 為

  • 總結
整理本章節的討論,我用 Unity3D 寫了一個只針對直接光(太陽)的 Diffuse BRDF。


下一個章節將會介紹 PBR 最核心的部分反射 BRDF。

  • References
[1] Brent Burley - "Physically-Based Shading at Disney", 2012
[2] Brian Karis - "Real Shading in Unreal Engine 4", 2013
[3] S'ebastien Lagard, Charies de Rousiers - "Moving Frostbite to Physically Based Rendering 3.0",2014
[4] M. Oren and S.K. Nayar, "Generalization of Lambert's Reflectance Model". SIGGRAPH. pp.239-246, Jul, 1994

  • 附註
1.事實上,Disney (Burley) diffuse BRDF 並不符合能量守恆的原則,但其所表現出來的畫面效果,仍受眾人肯定;EA(Electronic Arts)所研發的繪圖引擎(Frostbite)採用的 Diffuse BRDF,就是修改 Disney (Burley) diffuse BRDF,使其符合能量守恆。

2.在 Unreal 4 的 release note 上,記載了 Unreal 4.8 使用 Disney (Burley) diffuse BRDF,但到了 Unreal 4.9,又改回成 Normalized Lambert。

2020年3月16日 星期一

淺談 physically based rendering (2)


  • 前言
上一個章節簡單的介紹並狹隘的定義了 PBR,

本章節會針對基於物理的反射模型(BRDF)做深入的介紹。

我預計會在前幾個章節做介紹,實作部分會留到最後在做說明。

  • Rendering equation
先複習一下上一個章節提到的 Rendering equation (渲染方程式),


我們將焦點放在反射光的部分



首先,我相信各位一定對這個積分符號感到頭痛。

這符號叫做 Surface integral over hemisphere (半球積分)。

當我們用顯微鏡放大一個表面崎嶇物體的特定位置 x 的時候,

會發現 x 點在一個平面上。

對於這個平面上的 x 點,他的光源可能方向會是涵蓋了半個球型。

因此方程式使用半球積分來表示對所有方向的光源的反射計算。



但是為了不讓問題複雜化,我之後會只針對單一光源(太陽光)做說明。

所以渲染方程式的反射光可以簡化成


其中,

 是要渲染的位置

 是光源方向

 是反射方向

 是光源波長,這裡我們可以想成是光源本身,如果光源強度固定,可以忽略這個參數

 是時間,如果光源不隨時間變化,可以忽略這個參數


 是  的法向量

因此,反射光可以分成三個部分


radiant 可以想像成是來源光的能量

cos 項只要知道 Lambert 光照原理應該就不難理解其代表的意義。



  • 反射光
對於反射光,依據  Wes McDermott[1] 的解釋,可以分成兩個種類


圖片引用來源: Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」©Allegorithmic

Specular : 鏡面反射,也有人稱作 Highlight(高光),接觸到物體後直接反射。

Diffuse   : 擴散反射,和 Specular 不同的地方在於接觸到物體後,會進入到物體內部,
                 然後在物體內部繼續反射,直到離開物體;
                 因為在物體內作用的特性,這個光又叫做 Subsurface Scattering (表面下散乱)。

兩者的差別就是有沒有進入物體內。

因此,在做反射計算時,先要決定來源光被分解成 Specular 和 Diffuse 的比例。


物體反射的 radiant energy (輻射能量) 佔總 radiant energy 的百分比,就叫做反射率。

這個定義剛好解釋了 Specular 和 Diffuse 比重的關係。

反射率越高, Specular 比重越大。

而計算反射率的方法是使用下列公式

當光線從 material (媒質) A 垂直射到 material B,

令 material A 的 index of Refraction (折射率, 簡稱 ior) 為 

material B 的 ior 為 

則垂直反射率 R 為


因為是垂直入射的反射率(和法線夾角為0),所以 R 又可寫成 F0。

當光線和法線夾角為 θ 時,可以使用  Schlick's approximation 去求得夾角 θ 的反射率。

  • 結論
總結上述的討論,我們可以將反射光的部分改寫成下列公式


其中

frd  為 Diffuse 的 BRDF

frs  為 Specular 的 BRDF

在這裡,為了方便公式顯示,我省略了  和  


本章節簡單介紹 BRDF 的內容分成 Diffuse 和 Specular 的部分,

接下來會根據每個部份再繼續去介紹。



  • References


[1] Wes McDermott「The Comprehensive PBR Guide by Allegorithmic - vol. 1 Light and Matter : The theory of Physically-Based Rendering and Shading」©Allegorithmic