最近做了Ward BRDF的實現,相對於之前的lambert,phong來說,Ward是一個真正意義上的各向異性BRDF,但同樣的,Ward模型也是一個基於經驗的模型,並不是物理上正確的。它由ward本人於1992年在《Measuring and modeling anisotropic reflection》一文中首次提出,到目前為止它已經是圖形學中廣泛應用的一種BRDF了。有不少文章專門講述了Ward的理論與實現,其中比較著名的是Bruce Walter在2005年寫的《Notes on the Ward BRDF》,該文章從理論到實現都講了一遍。我在做Ward實現的時候就主要參考了這篇文章。Ward的BRDF定義用到了half vector的概念,half vector定義為h=(wi+wo)/|wi+wo|,就是入射光向量與出射光向量求和再標准化。按照ward本人的描述,Ward BRDF有兩個組成部分,一個是經典的漫反射部分ρd/π,另外一個部分有3個參數ρs,αx與αy。其實ρs就跟phong模型中的鏡面反射系數是差不多的,而αx與αy控制了高光在x和y方向上的范圍(也可以理解成表面在x和y方向上的粗糙程度)。當αx=αy的時候,該brdf描述的是一個各向同性的反射模型,其效果和phong很類似,反之則描述各向異性反射模型。接下來出場的是一個非常重要的函數:
f函數描述的是該表面上已知入射角向量i,那么得到出射角向量為o的概率是多少。由於BRDF具有對稱性,所以反過來也是一樣的,即已知出射角向量o,得到入射角向量為i的概率就是這個函數要求的東西。這其中的θi,θo,θh,Φh都是在表面局部坐標系下計算的,見下圖:
(圖中的向量v與z軸夾角寫為θv,Φv則是v在平面xOy上的投影與x方向的夾角)
在表面局部坐標系下,z方向就是表面法線方向,x和y方向分別表示了表面的切向量和副法線向量方向(這其實是表面的切向空間,之前在介紹法線貼圖的文章中已經講過了,這里就不重復了,詳情可以參考http://www.cnblogs.com/starfallen/archive/2013/03/29/2989277.html)。於是可以知道公式中的θi,θo,θh分別代表了入射向量i,出射向量o以及半角h與表面法向量的夾角,Φh則是h在物體表面上的投影與表面切向量的夾角。這里有一個必須要注意的問題,就是公式中的入射與出射向量i,o都是局部坐標系下的值,如果我們將世界坐標系中的相關向量帶入進去則會出錯。正確的做法是每次計算該公式前時做一次世界坐標系到局部坐標系的轉換,在完成后再轉換回去。所以這就是pbrt等開源構架在做bsdf采樣的時候要求入射向量與出射向量都是基於局部坐標系下的原因。光有f函數顯然是不夠的,為了能使Ward BRDF應用在全局光照中,必須要能對其進行重要性采樣,《Notes on the Ward BRDF》一文中詳細介紹了其方法。Ward BRDF重要性采樣的主要思想在於根據已知條件先確定半角h,再利用反射公式o=2*(i*h)h-i得到最終的出射向量。文中給出了h的具體求法:
其中u和v是兩個不相關的0~1間的隨機數,由於θh的公式中包含有Φh項,所以在實際計算的時候應當先算Φh。在計算Φh的時候,有一個必須注意的地方,就是要保證2πv和Φh在同一個象限,因為在程序設計時,我們通常用到的atan函數得到的結果是在-π/2~π/2之間的。
另外,在編寫程序的時候,還有一個細節值得注意,那就是重要性采樣函數在某些情況下得出的向量o可能不在法線一邊,通俗地說就是光線與表面作用后穿透到物體內部去了。為了更好地說明這一現象出現的根源,我用一個示意圖來解釋它:
該圖描述了在物體表面某處的各個向量的情況,綠色的向量z是表面法向量,紅色的i是已知的入射向量,藍色的h是隨機采樣得到的半角向量,由於h一定會與法向量z有一定夾角(那種h剛好與z重合的情況實在是太罕見了),那么就一定存在着采樣得到的出射向量o位於法向量另一側的情況(這種情況出現的幾率隨着i與z的夾角的增大而增大)。這一問題有很多處理方法,最簡單的,也是我采用的方法是忽略這樣的采樣值,認為它被表面吸收了。實際上這樣處理並不會導致錯誤,隨着采樣值的增多,最終結果會逐漸收斂到正確的解。在這個問題上,我們不用過多地擔心,因為Ward模型本身是一個經驗上的模型,並不保證物理上的正確性。實際上即使是phong模型,當入射角度與法線夾角很大的時候也會出現這種情況。
再說αx與αy兩個參數,一般我們會在0-1之間取值,取值越大,得到的高光區域越大。如果說對於一個點光源,當αx=αy的時候,高光呈現圓形的話,αx≠αy時高光就是橢圓形的,而且αx與αy的比例越大,橢圓越扁。當αx與αy其中一項取值為1的時候,高光在這個方向上的范圍為無限大(理論上如此,但實際上會受限於表面大小等因素)。下面一組圖中我實驗了比較有代表性的三種情況:
由此可見,我們可以很方便地調節這兩個參數來模擬各類各向異性材質。實際上,Ward BRDF很適合被用來模擬各向異性高光,以及各向異性反射,比如各種磨光的金屬表面。
最后,放上一張我渲染的含有Ward模型的結果: