如何正確理解 BRDF (雙向反射分布函數)?

BRDF和光線追蹤演算法是什麼關係? BRDF必須在光線追蹤渲染器中才能實現么?


BRDF是比簡單的光線追蹤過程更接近光學物理原理的模型。對於一個表面,它用來定義給定入射方向上的輻射照度(irradiance)如何影響給定出射方向上的輻射率(radiance)。更籠統地說,它描述了入射光線經過某個表面反射後如何在各個出射方向上分布——這可以是從理想鏡面反射到漫反射、各向同性(isotropic)或者各向異性(anisotropic)的各種反射。因此相比一般的光線追蹤,BRDF涵蓋了非常豐富的反射類型,例如各向異性的金屬表面、磨砂玻璃等。

再者,BRDF常用於各種全局光照(global illumination)演算法(例如path tracing),後者和光線追蹤(ray tracing)演算法分別是渲染演算法中的兩個類別。全局光照的特點在於能夠捕捉間接光照(indirect illumination),即由非發光表面反射的光線進一步作用於其他表面(例如Cornell Box場景中彩色牆壁反射到白色長方體上的光線),並可以用於模擬焦散(caustic)等光線追蹤演算法通常很難或者無法實現的效果。這也是「全局」一詞的含義——對光線在整個場景的傳播都進行考慮,而不只是考慮局部(local)的傳播。

實現全局光照和光線追蹤都需要使用到最基本的光線投射(ray casting)演算法,用來判定某條特定光線與表面的相交。

補充:還有比BRDF更加廣義的BSDF(S = Scattering)——它將折射現象也納入其中,以及進一步的BSSRDF(SS = Scattering-Surface)——它對光線在表面背後介質內部的傳播也進行了考慮。


根據題主的要求,通俗地解釋一下BRDF。

想像你有一個不透明的桌面,一個激光發射器。你先讓激光向下垂直地射在那個桌面上,這樣你就可以在桌面上看到一個亮點,接著你從各個不同的方向來觀察那個亮點,你會發現亮點的亮度隨著觀察方向的不同而發生了改變。然後你站著不動,改變激光發射方向和桌面的夾角,你又會發現亮點的亮度發生了改變。這就是說,一個表面對不同的光線入射角和反射角的組合,擁有不同的反射率。BRDF就是用來對這種反射性質進行定義的。

準確地定義參見:http://en.wikipedia.org/wiki/Bidirectional_reflectance_distribution_function


最近正在學習shader,順便來分享一下~

BRDF定義的是場景中的光照射到材質表面反射到視點的光亮度計算方法(方便的話,推薦參考一下《計算機圖形學與虛擬環境》(Mel Slater等著),裡面對下面的概念有詳細的定義)
光線追蹤是實現這種計算(而且不限於這種計算)的方法之一

------------------------------------------------------------------------------------------
先介紹一下了解BRDF之前需要了解的概念:

從物理角度來說(其實是理想化的物理模型應用在計算機圖形學中),對於單位體積的物體:
物體發射的光流量+流入物體的光流量=直接流量+反射流量+吸收流量
光流量是單位時間通過單位面積的能量
吸收的流量就不再是光了,不是我們所關心的。

光亮度是物體表面某方向單位投影區域單位立體角的光流量
沿著某條光線的光亮度是常數,但光通量隨距離增大而衰減(實際是二次衰減,但在計算機圖形學中採用線性衰減效果比較好)

光強度是單位立體角的輻射能量
輻射度是單位面積流出的光通量
輻照度是單位面積流入的光通量

它們的關係:
光強度=光亮度*單位面積*入射角餘弦
輻照度=光亮度*入射角餘弦*單位立體角
輻射度=光亮度*入射角餘弦*單位立體角(但方向不同)

BRDF規定的是輻照度光亮度的關係:
光亮度=BRDF*輻照度

但用到編程中,亂七八糟的概念就靠邊站了,只需要知道:
某點顯示在屏幕上的顏色=光源顏色*材質顏色*反射係數*你規定的函數
「你規定的函數」指的是和法線、光源方向、視點方向等與空間有關量的函數

BRDF主要有兩類:鏡面反射器和漫反射器

BRDF用非光線追蹤演算法就能實現(逐像素計算而不是逐頂點計算,具體到編程就是在片元著色器中進行向量的規範化和亮度計算,而不是頂點著色器),但只能計算光從物體表面直接反射進「人眼」產生的亮度,不能計算光在物體間反射或在(半)透明物體中的折射對亮度的影響。

常用的真實圖像渲染方法有:光線追蹤方法輻射度方法
光線追蹤方法適合處理物體間的鏡面反射
輻射度方法適合處理物體間的漫反射

光線追蹤方法模擬物理光在空間中的傳播(考慮反射和折射),從投影平面的一個像素點發出一條或多條光線進入場景,遇到物體表面就提取表面的材質信息,沿反射光線繼續前進(若是透明物體,再分出一條折射光線),這樣遞歸下去直到光線到達光源、場景之外(環境)或光亮度減小到規定的臨界值,將過程中所有顏色信息相加就是顯示在這一點的顏色。


推薦一個網站,裡面介紹了很多經典的BRDF模型,還給出了以紋理查找方式快速獲取亮度信息的方法:
D3DBook:Table Of Contents


首先要弄清楚各個物理量的意義,然後再去深入理解BRDF的含義,這是我總結的一張圖。對於一開始學習,不理解的是為什麼不直接使用同樣的物理量比如Radiance去定義BRDF,我記得July Dorcy這本書Digital Modeling of Material Appearance裡面寫的比較詳細,可以看看,時間比較長,我也記不大清楚,大概是和立體角有關係。。另外這個course Realistic Materials in Computer Graphics: Computer Graphics Bonn也不錯,對於各種材質的分類介紹得很清楚。


輻射分布上的一個線性算符…
渲染方程就可以這麼寫:left|L_o
ight>=left|E<br />
ight>+hatetaleft|L_i<br />
ight>
hateta是反射運算元,定義left<omega
ight|hatetaleft|psi
ight>=int_Omega f_r(omega(omega"cdotmathbf{n}),mathrm{d}omega"" eeimg="1">


brdf只是一個函數 你在OpenGL里實現基本phong模型也可以看作是brdf啊 當然pbr渲染是要求對brdf做積分得結果的


我寫了篇詳細講BRDF的文章,可以看看
https://zhuanlan.zhihu.com/p/21376124


BFDR是描述光與物體表面交互的一種數學模型,可簡單理解為,照射到物體表面的光強與從物體反射出來的光強存在一個比例關係,這個比例關係並沒有確定的公式。

為了在計算機圖形表現中實現光與物體的關係,各路大神提出了不同的實現模型,適用不同的場 景,包括:

經驗模型:不一定符合物理規律,但能模擬大部分光學現象,計算量小。比如Lambertain、Phong、Blinn-Phong

物理模型:符合物理規律,計算量比較高。如Cook-Torrance等

數據模型:就是用光學儀器測量真實數據


BRDF就是一個名字很複雜的函數,它主要的作用是描述光和不同介質之間的傳播關係,不同介質不同函數,拿最簡單的Lambertian漫反射來說,BRDF就是Kd/Pi這個數值,如果是玻璃的折射或鏡面反射,我們就要考慮光線的再次傳播,那麼BRDF就是一個遞歸的函數。BRDF的程序往往很短,大概幾行,沒事寫寫挺好玩的。五分鐘就可以寫一個玻璃的嘻嘻(?????????)


這裡有一個詳細的介紹 BRDF - Wakapon


推薦閱讀:

TAG:計算機 | CG | 計算機科學 | 計算機圖形學 |