- 前言
前兩篇對 physically based rendering 進行了簡單的說明,
本篇開始正式深入探討 BRDF 的內容。
BRDF 如上篇說言,分成 Diffuse BRDF(擴散反射) 和 Specular BRDF(鏡面反射)。
本章節將專注討論 Diffuse BRDF。
- Diffuse 反射
回顧一下上一章整理出的單一光源的反射光模型,我們將焦點放在 Diffuse反射部分。
首先,我們會遇到的問題是如何指定 F0 。(Fθ 可用 Schlick's approximation 去求得)
F0 的值是根據物質本身的物理反射率,
但事實上,要針對每個渲染物體去查出正確的反射率是一件不簡單的事。
對於遊戲研發人員來說,希望有一個簡單的規則可以取得每個物體的反射率近似值。
因此在實作上分為兩種做法 :
- metallic-roughness (又稱metallic workflow)
- 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)。
- F0 的近似值
F0 的近似值計算,目前參考的文獻[1][2][3]發現各個做法均有不同。
在本篇文章,我以 Unity3D 的作法為範例,進行說明與實作。
- Unity3D 的 F0 近似值
還記得上一章提到的垂直反射率的演算法嗎?
資料來源 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。
採用的理由有:
- 根據效能考量,Lambert 的計算是非常輕量且適用於 real-time
- 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 都看的到顏色)。
因此,我們必須要將所有的反射光能量總和等於入射光能量,才能說是滿足能量守恆。
資料來源 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。
沒有留言:
張貼留言