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。

沒有留言:

張貼留言