BRDF

一. BRDF簡介:


BRDF表示的是雙向反射分佈函數Bidirectional Reflectance Distribution Function),它描述了光線如何在物體表面進行反射,可以用來描述材質屬性BRDF的輸入參數是入射光的的仰角、方位角、出射光的仰角、方位角,還與入射光的波長相關。BRDF的輸出結果是一個數值,表示在給定的入射條件下,出射方向上反射的相對能量,另外一種理解方式是用光子的概念來考慮,BRDF給出了入射光子以特定方向離開的概率。

BRDF有一些重要的屬性:1.Helmholtz互異性(Helmholtz Reciprocity):入射角和出射角互換,函數值保持不變。2.能量守恆:出射能量不可能大於入射能量,所以BRDF必須進行歸一化處理。

由於BRDF是用於計算反射的函數,那麼對於某一個單一點光源的反射光的計算就可以簡化爲以下方程式:

L(Φoφo) = f(ΦiφiΦoφo)L(Φiφi)cos(Φi); (Φ表示光線仰角,φ表示方位角 i表示入射光o表示反射光L(Φiφi)表示入射光線仰角爲Φi方向角爲φi的光線輻射強度。f(ΦiφiΦoφo) 表示在入射角Φiφi,反射角Φoφo時的BRDF函數計算結果也就是反射強度cos(Φi)爲修正值。L(Φoφo)表示在反射光線仰角爲Φi方向角爲φi的光線輻射強度)仰角 方位角如下圖:



爲了符號簡化用歸一化的向量wi wo替代仰角和方向角,此外用向量n表示該點的法線,則該表達式可寫爲:

L(wo) = f(wi,wo)L(wi)(n·w1);//n·w1 = cos(Φi)



二.基於物理的BRDF:


關於BRDF的理論模型很多,常用的物理BRDF是通過微觀小平面對物體表面進行建模。也就是相當於對表面的放大,將表面的一點放大爲由衆多微觀小平面所組成。每個小的平面都是表面上的一個小平面鏡具有隨機的大小和角度,由衆多微觀的小平面形成了物體表面,因此對物體表面的反射函數也就變成了衆多微觀小平面的反射

每個微觀小平面把一個入射方向的光反射到單獨的一個出射方向,這取決於微觀小平面的法向h。當計算BRDF的時候,光源方向l和視線方向v都得給定。這意味着在表面上的所有微觀小平面中,只有剛好把l反射到v的那部分對反射函數有貢獻(用方法F(l,h)表示計算所有微觀小平面產生的反射)。(在下圖中,只有紅色部分的微觀小平面形成的反射對該表面l入射光v反射光的計算起作用。)

但我們應該清楚的認識到並非所有紅色部分的反射都是有效反射。這些微觀小平面之間可能相互遮蔽(在給定光線方向上,一些微觀小平面可能在另外一些小平面上產生陰影)或者相互遮擋(在給定觀察方向上一些小平面可能位於另一些小平面的前面)G(lvh)函數用於計算有效的微觀小平面所佔的比例。另外並非所有的微觀小平面的法線剛好爲h可以產生v方向的反射因此需要函數D(h)計算出h方向法線的分佈情況。綜上所述物理的BRDF函數在微觀小平面理論的基礎下就變爲了:

LaTeX: \rho(\mathbf{l}, \mathbf{v})=\frac{F(\mathbf{l},\mathbf{h})G(\mathbf{l},\mathbf{v},\mathbf{h})D(\mathbf{h})}{4(\mathbf{n} \cdot \mathbf{l})(\mathbf{n} \cdot \mathbf{v})}

分母4(n·l)(n·v)是個校正因子,用來校正從微觀小平面的局部空間轉到整體表面的數量差異。



基於微觀小平面的BRDF的核心算法即爲F(l,h),常用的算法爲Fresnel公式,一個完整的Fresnel公式依賴於入射角,折射係數,消光係數等因素,利用它可以計算出光線的偏振和非偏振值,在圖形學上通常會忽略偏振。完整的Fresnel公式如下:

其中 c= v(l+h)/(||l+h||); g=sqrt(n*n + c * c -1)

(l+h)/(||l+h||) 向量l加上向量h除以l加h的模被稱爲半角向量。


由於此Fresnel公式計算較爲複雜故遊戲中一般使用Schlick近似的Fresnel項,近似後的Fresnel項爲:

LaTeX: F_{Schlick}(\mathbf{c}_{spec}, \mathbf{l}, \mathbf{h})=\mathbf{c}_{spec}+(1-\mathbf{c}_{spec})(1-\mathbf{l} \cdot \mathbf{h})^5其中cspec是specular顏色。


遮擋項G(lvh)也經常稱爲幾何項 。在很多情況下,遮擋項在某種程度上抵消了微觀小平面方程中的分母,替換成類似於這樣的形式。遮擋項對BRDF保能量是很重要的——沒有這個項的話,BRDF反射出的能量可能比接收到的更多。在遊戲中可將G(lvh)/近似爲一個參數。


在大部分表面上,微觀小平面的方向不是均勻分佈的。微觀小平面的法線越接近宏表面的法線,就越光滑。

這個分佈由微觀小平面的法線分佈函數D(h)來定義。函數D()決定了specular高光的大小、亮度和形狀。 法線分佈

函數一般有類似於“粗糙度”這樣的參數(各向異性的函數通常有兩個參數)。在遊戲中可將D(m)近似爲一個參數。


三.AWAY3D中的BRDF:


在away3d中計算高光的方式中採用FresnelSpecularMethod來計算高光。其具體實現方式就是用shader實現LaTeX: F_{Schlick}(\mathbf{c}_{spec}, \mathbf{l}, \mathbf{h})=\mathbf{c}_{spec}+(1-\mathbf{c}_{spec})(1-\mathbf{l} \cdot \mathbf{h})^5具體代碼如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章