Microfacet 微平面模型是普遍應用的對rough surface建模的工具,基本上生產和科研裏用到的那些耳熟能詳的模型,blinn,ward,beckmann都屬於microfacet的推導結果。基本思想也很簡單,就是用很小的微平面的組合去模擬粗糙的物體表面。而這些微小的平面元則能夠當作完美的反射或者折射表面。segmentfault
理論上的Microfacet模型應該包含了實際的粗糙表面全部光學行爲包括反射折射。不過實際上在production的渲染中應該是把鏡面高光和漫反射分離--僅僅是爲了方便調整。這裏的討論和總結只針對通常狀況,既完整的BRDF表達式。函數
1.Mircrofacet distribution function工具
咱們用一個關於法向量m的函數D來描述微平面的分佈狀況,而這個函數關於立體角的積分就等於物體的表面積,固然它確定大於或者等於物體的宏觀表面積:spa
分佈函數D基本上決定了Microfacet模型BRDF的形狀和性質,咱們所說的Blinn, GGX 也就是這些分佈的名稱。圖片
2. Shadowing-Masking function Gio
函數G是一個雙向函數,也就是說:function
G(i,o,m) = G(o,i,m)class
實際上函數G對最終的BRDF形狀影響很小,在重要性採樣的時候通常也會忽略之,不過G仍是必要的,主要爲了表面反射和折射的能量守恆。渲染
通常用到的G函數有beckmann推導的G:書籍
3. BSDF的推導
咱們把每一個微平面的scattering行爲當作完美鏡面反射或者折射,而後對微平面m向量積分,就能夠獲得BSDF的表達式:
在G 和 D 的表達式都已知的狀況下咱們只要把fs用純鏡面的函數來表示就能夠了,具體參考光學書籍裏計算fresnel反射和fresnel折射的公式,有一點須要注意的就是這個積分是關於m向量的,而實際上BRDF或者BTDF函數都是關於出射光線方向向量的,因此這裏須要作一個轉換,也就是高數上說的計算雅克比行列式:
和
對於鏡面反射,法向量就是出射和入射向量的半角向量,以下圖:
可算出:
對於折射來講,由半角向量推導出出射向量會稍微複雜:
最後能夠獲得的行列式爲:
代入那個積分的式子,能夠獲得BSDF表達式。
反射:
折射:
4.重要性採樣
在採樣Microfacet BSDF的時候,咱們通常是按照D函數的形狀去分佈採樣點,由於D致使了BSDF結果絕大部分的variance,並且BSDF表達式自己是由三個函數的乘積構成,按照它去重要性採樣是不可能的。
具體採樣的辦法能夠參考上一篇博文,採樣獲得半角向量m以後,再反推出出射向量。
5.結果比較
實際上各類BSDF在渲染中的差異沒有那麼大,調整參數都能出相似的效果,實際儀器測量BSDF的具體參數顯然是最靠譜的模擬一種表面的方法,固然也有不少科研人員是這麼幹的,不過在production裏顯得不那麼實際。
Phong:
Blinn:
GGX: