幾種幾何表面上的采樣
這篇專欄算是接下來光追專欄的預(yù)熱,? 因?yàn)楣庾匪惴ㄊ褂玫氖敲商乜宸e分渲染的,? 而蒙特卡洛積分里需要進(jìn)行大量的幾何表面面采樣,? 所以這里就直接單獨(dú)拿出來講了.

單位正方形上的均勻采樣
為了專欄的減少篇幅和使結(jié)構(gòu)更加清晰,? 這里假設(shè)有一種算法可以在單位正方形上進(jìn)行均勻采樣,? 最簡單的當(dāng)然就是使用編程語言里內(nèi)置的隨機(jī)浮點(diǎn)數(shù)生成方法:
但是實(shí)際上這種采樣會造成巨大的標(biāo)準(zhǔn)差 (即在少量樣本里不足夠均勻),? 所以在光追算法里為了提高在一定計(jì)算時間內(nèi)圖像的質(zhì)量,? 提出了很多種生成在單位正方形上均勻采樣的方法.? 但是采樣生成方法還是留到之后再說吧.
接下來的所有幾何表面采樣都不是直接在表面上進(jìn)行采樣,? 而是在單位正方形上采樣后再投射到幾何表面上,? 這可以提高方法的復(fù)用度,? 比如說有多種單位正方形上采樣的方法,? 那么相應(yīng)的半球采樣只需要定義單位正方形到半球的投射,? 而不是重新定義多種直接在半球上的采樣方法.? 另外需要聲明,? 整篇專欄都不會對區(qū)間邊界進(jìn)行討論,? 因?yàn)閰^(qū)間邊界對采樣的貢獻(xiàn)永遠(yuǎn)都是 0 (數(shù)學(xué)上, 編程里還是需要稍微注意一下的),? 所以區(qū)間的開閉性都是亂來的.
下圖是兩個在單位正方形上均勻的采樣集,? 分別是256個采樣點(diǎn)和2048個,? 之后展示投射方法的正確性就使用這兩個采樣集.


單位圓面上的均勻采樣
單位圓面定義為?.? 描述與圓相關(guān)的東西時,? 極坐標(biāo)是一個非常方便的坐標(biāo)系,? 極坐標(biāo)與笛卡爾坐標(biāo)有轉(zhuǎn)換公式:
?和
,? 其中 atan2 是一個編程上常用的方法,? 而不是嚴(yán)格的數(shù)學(xué)函數(shù),? 但是用這個函數(shù)會省下計(jì)算 tan?1 的麻煩 (比如象限討論和除以≈0造成的數(shù)值不穩(wěn)定).
為了確保采樣的均勻性,? 需要計(jì)算面積元??在對應(yīng)的坐標(biāo)系里的形式.? 把上面的轉(zhuǎn)換公式代入不難得出在極坐標(biāo)下面積元為?
,? 稍加變換得到
,? 結(jié)合單位面積在笛卡爾坐標(biāo)下的定義,? 可以定義單位正方形到單位圓面上的均勻投射為?
,? 在單位正方形內(nèi), x和y定義在 [0,1] 上,? 而單位圓面定義 r 在 [0,1] 上,?φ 在 [0,2π] 上,? 于是得到投射公式
,? 下面是使用上面展示過的采樣集進(jìn)行投射的結(jié)果

另外 Shirley 提出了一個同心投射的方法:? 把正方形 [-1,1]2 分割為4個三角形,? 然后將三角形投射到單位圓的扇形上,? 即下圖所示

相應(yīng)的從單位正方形到單位圓的投射方法為:
使用這種投射方法的結(jié)果為:

Shirley 的方法與上面推導(dǎo)的少了算一個 sqrt,? 所以在性能上有優(yōu)勢.? 但在實(shí)際光追算法里,? 是初始化時生成一大個樣本集提供給光追里使用,? 所以這點(diǎn)性能差距也不算太重要了.

單位球面上的均勻采樣
單位球面定義為?,? 與極坐標(biāo)類似,? 三維空間有相應(yīng)的球極坐標(biāo) (r 距離,
θ 天頂角, φ 方位角),? 其中天頂角是從z軸到目標(biāo)向量之間的夾角.? 球極坐標(biāo)和笛卡爾坐標(biāo)的轉(zhuǎn)換公式為? 和?
.? 對于單位球面,? r 固定為1,? 于是自由變量只有 θ 和?φ,? 這兩個變量合在一起成為立體角,? 用符號 Ω 表示.
立體角的微元 dΩ 可以看作單位球面上的面積元 dA,? 為了避免符號沖突,? 這里使用 u 和 v 代替單位正方形上的 x 和 y,? 那么有?.? 并且由球極坐標(biāo)的定義可以得到立體角的微元為?
,? 稍加變換得到?
.? 即得到單位正方形到單位球面的均勻投射為?
,? 在立體角里 θ 取值為 [0, π], φ 取值為 [0, 2π],? 于是最后得到?
.? 在實(shí)際計(jì)算里不需要把 θ 算出來,? 因?yàn)?1-2u 已經(jīng)給出了 cosθ 的值,? 則有
,? 并且平方根的計(jì)算速度比 sin, cos 快很多.
下圖為投射的結(jié)果,? 左邊為 x,z 分量,? 右邊為 x,y 分量

在這里真的很難看出來樣本的均勻分布,? 非常推薦自己去用 plot 的3d顯示看一下.

半球面上的不均勻采樣
半球定義為單位球面里 z>0 的部分,? 即 θ<π/2.? 半球的不均勻采樣在光追里常用來計(jì)算高光和優(yōu)化反射采樣.? 半球的不均勻采樣里有一個常數(shù) c 用于表示采樣點(diǎn)在半球上的集中度,? 樣本在立體角上的分布正比于 ,? 下面為 c=10 和 c=100 時的樣本分布

特殊地,? 當(dāng) c=0 時則為半球的均勻采樣.
因?yàn)榘肭蛏系牟蓸硬皇蔷鶆虻?? 采樣分布與立體角有關(guān)系?,? 于是可以假設(shè)?
,? 可以看到?dφ 與球面采樣里 dφ 是一致的,? 那么 φ 分量的投射與球面的相同.? 類比于圓面和球面采樣,? 不難知道這里需要找到一個關(guān)于 θ 的表達(dá)式 Θ 使得?
,? 也就是求積分.? 經(jīng)過一番頭腦風(fēng)暴* 之后可以求得?
.? 因?yàn)榘肭蚶?θ 取值為 [0, π/2],? 所以 Θ 取值為 [0, 1/(c+1)].? 最后求得相應(yīng)的 θ 分量的投射為?
.
*: 湊微分法,? 又稱東湊西湊總之不知道為什么就拼對了法 (

三角形上的均勻采樣
以三角形其中一個點(diǎn)為局部坐標(biāo)系的原點(diǎn),? 那么三角形的另外兩個點(diǎn)在局部坐標(biāo)系里可以表示為兩個向量: A, B.? 然后對單位正方形上的采樣點(diǎn)進(jìn)行處理: 把 1-x>y 的點(diǎn)重新投射到 1-x<y 里,? 于是得到處于 (0,0)-(0,1)-(1,0)?里的均勻采樣.? 那么三角形上的均勻投射為 x*A+y*B.
這是容易證明的 (線性變換),? 但是由于有點(diǎn)難展示 (懶得再寫程序了),? 所以這里提一下就算了.

有了這幾個幾何面的采樣方法,? 足以應(yīng)對簡單場景的光追渲染了.? 下一篇專欄大概就是來討論一下如何生成單位正方形上的均勻采樣了,? 之后的話應(yīng)該就是光追的主專欄了.
展示一下一個極簡場景的渲染圖 (只有一次光線反射).

最后宣傳一下澀弔圖群:??274767696