Ward BRDF實現心得

2021-07-11 17:17:26 字數 2611 閱讀 6865

最近做了ward brdf的實現,相對於之前的lambert,phong來說,ward是乙個真正意義上的各向異性brdf,但同樣的,ward模型也是乙個基於經驗的模型,並不是物理上正確的。它由ward本人於2023年在《measuring and modeling anisotropic reflection》一文中首次提出,到目前為止它已經是圖形學中廣泛應用的一種brdf了。有不少文章專門講述了ward的理論與實現,其中比較著名的是bruce walter在2023年寫的《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方向分別表示了表面的切向量和副法線向量方向(這其實是表面的切向空間,之前在介紹法線貼圖的文章中已經講過了,這裡就不重複了,詳情可以參考於是可以知道公式中的θ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模型的結果:

閱簡單工廠實現心得

工廠模式心得 以connection類的createcommad方法為例 commad基類 public abstract class commad sqlcommad類 public class sqlcommad commad sqlcommad 具體實現方法 oraclecommad類 pub...

資料匯入功能實現心得

剛接到這個需求感覺很簡單,看大致意思主要是,從excel中讀取資料並寫入到資料庫中,唯一特殊之處是有一列大字段 超過4000個字元,在資料庫中需要用clob型別儲存 需特殊處理。想了下把 寫好了。開始測試發現,匯入一條資料需要8秒左右,按這速度導20萬資料的話,不敢往下想了,於是想著 調優,優化以後...

pyhooks實現鍵盤監控學習心得

pyhooks api手冊 以上 上提供了個使用的例子,另外安裝pyhooks後,也會有乙個例子的檔案。於是拿來學習了一下,第一次執行時,提示沒有pythoncom模組,就安裝了pywin32,安裝後,可以正常執行,但是會導致機器發卡,特別是中斷程式執行後,滑鼠會出現一段時間的自由晃動,找了半天原因...