[光線追蹤] 03 -- 蒙特卡洛積分
在上一篇專欄里描述了兩種渲染模型 -- 半球模型和面積模型,? 兩種模型都給出了包含積分項的式子,? 那么渲染實際上就是求積分的近似值.? 那么這篇專欄就來討論如何求解這個積分.

蒙特卡洛積分
在深入講解積分內(nèi)包含求解量的復(fù)雜積分前,? 首先來看看最簡單的積分?.
如果這個積分無法直接求出,? 那么有很多方法可以求得這個積分的近似值,? 但是這里不會介紹?Gauss–Kronrod 求積之類復(fù)雜的東西.
首先回顧積分的定義可以知道:?,? 在學(xué)習(xí)積分時,? 常把積分看作一噸長方形面積相加,? 上式的
?作為長方形的高,?
?作為底.? 但是可以把符號進行重新解釋:?
?作為某種均勻分布在
?上的采樣,? 并且?x? 的概率密度函數(shù)為
,? 那么積分定義可以改寫為
.
蒙特卡洛積分 (下面簡稱 MC 積分) 與上式的形式相同,? 但 x? 不再是依賴于下標 i 的數(shù)值,? 而是符合 p 分布的隨機數(shù).? 那么 MC 積分為?.
例子:? ?,? 積分區(qū)間為?
,? 使用兩種分布展示 MC 積分的正確性:? 均勻分布 和 正態(tài)分布(σ=0.5,?μ=1.),? 如下圖所示

使用 10^5 采樣數(shù)的結(jié)果如下:

可以看到兩種分布都可以收斂至準確答案附近.

誤差 & 重要性采樣
在 MC 積分里,? 選取合適的分布函數(shù)可以使得積分計算快速收斂.? 為了量化累加收斂的速度,? 需要計算累加項的誤差:??,? 當 σ 值越小時說明收斂速度越快.
在給定 f 時,? σ 的值與分布 p 相關(guān).? 為了降低 σ,? 應(yīng)該使每一項??與?
接近,? 當 σ 取最小值 0 時有?
,? 也就是當分布 p 為 f 本身時使得誤差最小.? 但絕大部分情況下,? f 分布是很難或不能求出的,? 所以應(yīng)該選取與 f 盡可能接近的分布 p,? 這就叫做重要性采樣.
例子:? f(x) = x + x2,? 積分區(qū)間 [0, 1],? 考慮 3 個積分:? 均勻分布,? 正態(tài)分布?(σ=.5,?μ=1)?和 正態(tài)分布?(σ=.5,?μ=0),? 如下圖所示

使用 10^5 采樣數(shù)計算誤差為:

可以看到誤差與分布形狀相關(guān),? 分布形狀越接近 f 的誤差越小.
另外有一個可取的"捷徑",? 如果需要計算積分?,? 由 MC 積分給出:
,? 其中 N? 是 p 的歸一化因子?
,? 這種方法可以化簡計算.
上面例子使用的程序如下 (julia)


MC 積分在光追里的應(yīng)用
MC 積分比起其他類型的積分有一個優(yōu)勢,? 就是 MC 積分是依賴于采樣方法進行的,? 也就是說高維積分,? 比如半球面上的?,? 如果存在直接從半球面上生成采樣的方法 (見采樣方法的兩篇專欄: 1?和 2),? 那么 MC 積分就可以如同一維積分一樣直接進行計算,? 而其他方法還需要對高維積分下的每個變量進行積分計算.
對于半球模型 (符號就不寫完整了, 并且忽略 L?):?,? 可以看到積分里有兩個描述分布的項:
?和
,? 由 MC 積分給出求解:?
.? 當分布 f?cosθ 不能給出時,? 可以計算
,? 其中 cosθ 分布即是集中度為 1 的半球分布,? 半球采樣已經(jīng)在之前的專欄里討論過了.? 使用 cosθ 分布求解光追的收斂速度盡管沒有使用 f?cosθ 的那么快,? 但也比半球的均勻分布更好,? 下面是使用 cosθ 分布 (上) 和均勻分布 (下) 的渲染結(jié)果 (64個采樣)


對于面積模型:??,? 因為入射方向是由 q 確定的,? 所以這里是不能使用?f? 或 cosθ 作為分布去計算積分,? 因為 q 是分布在物體上的,? 所以對物體進行均勻采樣,? 那么面積模型的求解為?
,? 其中 A 是物體的表面積.? 看上去面積模型并不能使用 MC 積分化簡計算,? 但在實際使用里是用面積模型去化簡半球模型 (見下).

渲染模型的混合使用
在常見場景里,? 發(fā)光物體的數(shù)量是遠遠少于不發(fā)光物體的數(shù)量,? 并且光源的直接照射對 L? 的貢獻是很大的,? 所以在計算 L? 時對每個光源單獨計算積分可以使收斂速度大大加快.? 所以對算符形式的渲染模型??進行修改,? 把發(fā)光物體和不發(fā)光物體分離得到?
,? 其中 L?,obj 代表不發(fā)光物體表面的出射輻照度,? L?,light 代表發(fā)光物體表面的出射輻照度,? K? 表示半球渲染,? K? 表示面積渲染,? 那么這個渲染模型實際為

另外,? 因為 light 已經(jīng)在 K?°L? 項計算過了,? 所以如果出現(xiàn) K?°L? 指向 light 時,? 應(yīng)該返回 0 輻照度,? 否則意味著 light 會被渲染兩次.
最后,? 為了化簡模型,? 可以大膽假設(shè)光源不反射任何光線,? 即是?.? 看上去這個假設(shè)非常牽強,? 但實際上渲染出的圖像仍然是足夠真實的,? 因為在 LDR 渲染里,? 光源光線的輻照度可以到 50 以上,? 而對比物體的反射光線最大只有 1?左右,? 所以這個假設(shè)并不是無稽之談.? 但在 HDR 渲染里,? 為了渲染真實場景,? 部分光源(比如太陽)的輻照度可能到幾萬以上,? 反射光線的輻照度會大于普通光源的輻照度,??這時的這個假設(shè)就會造成無法正確渲染了,? 但實際上把光源的反射光線算上并不會對模型造成過大的更改.

光追的數(shù)學(xué)模型到這里就基本上固定下來了,? 下一篇專欄對光追程序的結(jié)構(gòu)進行一個簡述,? 然后就可以開始構(gòu)建光追的實際程序了.
封面pid:?94213121