最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

采樣技術(shù) -- 在單位正方形上均勻采樣

2022-05-11 20:11 作者:nyasyamorina  | 我要投稿

上一篇專欄里說過,? 幾何表面上的采樣的步驟為:? 1. 在單位正方形上采樣,? 2. 把采樣投射到幾何表面上,? 并且對(duì)幾種幾何表面的投射方法進(jìn)行了討論,? 那么這篇專欄來討論一下在單位正方形上的均勻采樣.


關(guān)于采樣的生成方法

為了方便管理代碼,? 理想的采樣生成方法應(yīng)該為:? 1. 初始化采樣生成器,? 2. 直接從生成器里獲得下一個(gè)采樣.? 用代碼來說就是這樣:

這對(duì)于一部分采樣方法來說是可以實(shí)現(xiàn)的 (比如說隨機(jī)采樣,? 均勻采樣等),? 但是對(duì)于一些更好的采樣方法 (含有 NRooks 條件的) 這是難以實(shí)現(xiàn)的.

所以實(shí)際的采樣生成方法應(yīng)該為:? 1. 從采樣生成器里獲得一大片采樣,? 2. 通過索引獲取采樣.? 下面是大概的代碼邏輯:

需要注意的是,? 從采樣生成器里取得采樣集時(shí),? 應(yīng)該取不止一個(gè)采樣集,? 因?yàn)楫?dāng)只有一個(gè)采樣集時(shí),? 兩次完整采樣之間的分布將會(huì)是一模一樣,? 從而造成渲染質(zhì)量低下的情況. (下圖為 1 個(gè)采樣集與?83 個(gè)采樣集的渲染結(jié)果,? 可以看到 1 個(gè)采樣集出現(xiàn)了很多奇怪的條紋)

1 個(gè)采樣集
83 個(gè)采樣集


下面將會(huì)詳細(xì)討論幾種不同的采樣生成方法,? 并且所有不同的采樣生成方法都繼承自 `IGenerator` 這個(gè)模板,? 并且只需重寫 `GenerateSamples` 方法,? 這個(gè)方法接受兩個(gè)正整數(shù)參數(shù):? 需要的采樣集數(shù)量 和 一個(gè)采樣集里的采樣數(shù)量.

隨機(jī)采樣

最簡(jiǎn)單的在單位正方形上的均勻采樣就是選兩個(gè)隨機(jī)數(shù)拼起來:

下圖為隨機(jī)采樣的其中一個(gè)采樣集 (64個(gè)采樣)

可以看到采樣分布非常不均勻,? 有些地方出現(xiàn)大片空缺,? 但有些地方采樣過于密集.? 在需要采樣數(shù)量較少的光追算法里,? 這樣不均勻的采樣是不能很好地反映幾何表面的特征的.


均勻采樣

保證采樣分布均勻,? 最簡(jiǎn)單的方法就是直接讓采樣等距分布,? 如下圖所示

實(shí)現(xiàn)這個(gè)算法也是非常簡(jiǎn)單的:

實(shí)現(xiàn)代碼時(shí)需要注意到,? 因?yàn)榫鶆虿蓸拥牟蓸訑?shù)量永遠(yuǎn)都是平方數(shù),? 所以實(shí)際生成的采樣數(shù)量與輸入的數(shù)量可能會(huì)不一樣,? 并且又因?yàn)檫@個(gè)采樣不包括隨機(jī)項(xiàng),? 無論生成多少個(gè)采樣集都是一樣的,? 所以這里可以直接忽略輸入的采樣集數(shù)量.

但是均勻采樣的均勻性反而是最大的壞處,? 在實(shí)際場(chǎng)景里會(huì)因?yàn)椴蓸舆^于規(guī)則產(chǎn)生嚴(yán)重的摩爾紋或者光線方向過于固定的情況:

觀察右上角
觀察影子

同時(shí)均勻采樣在某些地方甚至?xí)a(chǎn)生比隨機(jī)采樣更加不均勻的采樣 (見底部 -- 對(duì)于足夠均勻的采樣的投射問題).


抖動(dòng)采樣

抖動(dòng)采樣引入了分層技術(shù),? 分層技術(shù)就是把單位正方形分割為多個(gè)區(qū)域,? 然后在每個(gè)區(qū)域上生成采樣,? 這可以確保采樣不會(huì)過于集中.? 算法實(shí)現(xiàn)如下:

下面是抖動(dòng)采樣生成的采樣集 (64個(gè)采樣)

可以看到采樣分布比隨機(jī)采樣均勻了很多.


n-Rooks 采樣

在抖動(dòng)采樣里仍然存在一些問題,? 采樣在某個(gè)軸方向上并不是分層的,? 這樣可能會(huì)造成在某些幾何表面上采樣極其不均勻:? 在上一篇專欄里討論過,? 幾何表面的采樣只是把單位正方形上采樣的 x, y 分量投射到幾何表面的參數(shù)分量上,? 也就是說原采樣在分量上的不均勻會(huì)導(dǎo)致幾何表面上采樣的不均勻,? 下圖是不使用 Shirley 的同心圓投射的圓上抖動(dòng)采樣:

可以看到采樣點(diǎn)分布比較不均勻.? 于是提出了 n-Rooks 采樣:

n-Rooks 采樣會(huì)先預(yù)生成在 x, y 分量上分層的采樣:

然后打亂采樣的分量

下面是 n-Rooks 的全部代碼

雖然 n-Rooks 采樣確保了采樣在分量上分層,? 但不確保采樣在單位正方形內(nèi)分層,? 所以實(shí)際效果可能連隨機(jī)采樣都不如,? 下面是 n-Rooks 采樣的一個(gè)采樣集 (64個(gè)采樣)

多重抖動(dòng)采樣

雖然 n-Rooks 采樣表現(xiàn)不佳,? 但是這個(gè)想法與抖動(dòng)采樣結(jié)合產(chǎn)生了多重抖動(dòng)采樣.? 多重抖動(dòng)采樣在抖動(dòng)采樣的分層條件上繼續(xù)分層,? 產(chǎn)生了兩層網(wǎng)格,? 而采樣則生成在網(wǎng)格內(nèi):

采樣的預(yù)生成部分為:

當(dāng)預(yù)生成好采樣后,? 需要對(duì)分量進(jìn)行打亂.? 需要注意的是,? 這里不能隨便打亂,? 而是對(duì)分布在第一層網(wǎng)格上同一列的采樣打亂 x 分量,? 而同一行的采樣打亂 y 分量:

多重抖動(dòng)采樣是綜合表現(xiàn)最好的采樣方法,? 下面的一個(gè)采樣集和這個(gè)采樣集在圓上的投射 (64個(gè)采樣)

正確多重采樣

多重采樣有一個(gè)改進(jìn)的版本,? 可以使得采樣之間的分布更加均勻.? 多重采樣里采樣的不均勻的原因是來自打亂分量這個(gè)操作.? 為了確保采樣之間距離的均勻,? 打亂分量是一個(gè)對(duì)同一行 (或列) 的 y (或 x) 分量進(jìn)行打亂,? 亦即:

這樣生成的采樣會(huì)更加均勻:

Hammersley 采樣 和?Halton 采樣

Hammersley 采樣是早期用于替代均勻采樣的一種非隨機(jī)采樣算法,??Hammersley 采樣因?yàn)槭欠请S機(jī)的,? 所以與均勻采樣一樣只有一個(gè)采樣集.? 但除了只有一個(gè)采樣集這個(gè)缺點(diǎn),? 其他方面表現(xiàn)得比多重抖動(dòng)采樣還好.

在 p 進(jìn)制下,? 所有非負(fù)整數(shù) k 都可以表示為 k%3Da_0p%5E0%2Ba_1p%5E1%2Ba_2p%5E2%2B%5Ccdots,? 那么定義 Φ 為 k 在 p 進(jìn)制下沿小數(shù)點(diǎn)的鏡像對(duì)稱:?%5CPhi_%7Bk%2Cp%7D%3Da_0p%5E%7B-1%7D%2Ba_1p%5E%7B-2%7D%2Ba_2p%5E%7B-3%7D%2B%5Ccdots.

那么早期的?Hammersley 采樣算法為

但是這種早期算法有點(diǎn)分層上的問題,? 于是改進(jìn)后的?Halton 算法為

其中 p0, p1 為兩個(gè)不同的質(zhì)數(shù),? 下面展示了幾種不同 p0, p1 產(chǎn)生的采樣集 (256個(gè)采樣)

p0=3, p1=2
p0=2, p1=5
p0=5, p1=7
p0=11, p1=7

兩種算法里的 Phi 為

對(duì)于足夠均勻的采樣的投射問題

以單位圓面為例,? 投射公式為?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7Dr%3D%5Csqrt%20x%5C%5C%5Cvarphi%3D2%5Cpi%20y%5Cend%7Bmatrix%7D%5Cright.,? 當(dāng)采樣集足夠均勻時(shí) (差不多是等距分布,? 如均勻采樣和正確多重抖動(dòng)采樣),? 采樣集投射后會(huì)形成一條一條從原點(diǎn)出發(fā)的射線,? 如下圖所示:? (均勻采樣,? 256個(gè)采樣)

雖然 Shirley 提出的同心圓投射方法解決了這個(gè)問題 (見下).

但類似的現(xiàn)象還會(huì)發(fā)生在球面和半球投射上,? 因?yàn)檫@個(gè)原因,? 正確多重抖動(dòng)采樣非常不適合在球面和半球上采樣 (見下,? 圖一為正確多重采樣,? 圖二為多重采樣,? 2048個(gè)采樣)

可以看到就算是多重抖動(dòng)采樣在半球邊緣也出現(xiàn)了類似條紋的圖案,? 但是?Hammersley?采樣 和?Halton 采樣卻沒有這種情況,? 因?yàn)檫@兩個(gè)采樣是在接近對(duì)角線上等距分布,? 而不是在水平和垂直方向上 (見下,? 圖一 Hammersley?采樣,? 圖二?Halton 采樣)

所以我猜想真正好的采樣應(yīng)該是類似正確多重采樣的隨機(jī)采樣,? 但是采樣是沿對(duì)角線等距分布的,? 但是在我的知識(shí)范圍內(nèi)好像不存在這樣的采樣方法,? 如果有人有頭豬的話歡迎在評(píng)論區(qū)補(bǔ)充.


混合索引

在上述的采樣方法里,? 生成的采樣集多數(shù)都是沿著索引,? 采樣從左下角開始到右上角的.? 這種普遍性會(huì)帶來強(qiáng)烈的索引相關(guān)性 (也就是多個(gè)采樣集都在相近的地方采樣) 從而造成不必要的渲染錯(cuò)誤,? 對(duì)此可以重寫 `Sampler` 類的初始化函數(shù),? 在初始化時(shí)對(duì)索引進(jìn)行打亂:

類似地,??采樣集上也存在索引相關(guān)性,? 所以當(dāng)切換采樣集時(shí)應(yīng)該隨機(jī)選取采樣集,? 而不是跳轉(zhuǎn)到下一個(gè):

下面是不使用和使用混合索引的區(qū)別:

關(guān)于光追里的采樣技術(shù)的全部?jī)?nèi)容就這些了,? 不出意料的話下一篇專欄就終于可以正式開始了.


不過趁著專欄還沒正式開始,? 還是想糾結(jié)一下到底是用什么編程語言做專欄里的主要語言呢.

如果要速度優(yōu)先的話,? 最好當(dāng)然是C艸,? 但是C艸寫起來挺復(fù)雜的,? 我只是打算搓一個(gè) MWE 用于展示而已.

如果要簡(jiǎn)潔的話可能是 python 會(huì)好一點(diǎn),? 但是這樣說,? py算光追,? 洗洗睡吧.

其實(shí)既簡(jiǎn)潔又快速的語言不是沒有,? julia 就是一個(gè)非常完美的選項(xiàng),? 但是b站專欄沒有對(duì) jl 做代碼適配,? 發(fā)代碼就只能貼 PlaneText 了.

折中一下的話其實(shí) C# 也可以接受,? 但是就算是 C# 運(yùn)行速度也不盡人意.

不過,? 再說吧. (大概率是選 jl 的了)


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

封面pid:?35231457

采樣技術(shù) -- 在單位正方形上均勻采樣的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
雷州市| 遂平县| 卓资县| 于田县| 陆川县| 阿图什市| 信宜市| 安福县| 右玉县| 荆门市| 德化县| 桃园县| 商丘市| 关岭| 板桥市| 民丰县| 安远县| 湖南省| 和平县| 临沂市| 临城县| 沙坪坝区| 涞水县| 辽宁省| 阿拉善左旗| 巍山| 仁化县| 高雄市| 汉源县| 湖北省| 西藏| 牙克石市| 莱芜市| 赤水市| 大同市| 土默特左旗| 卢湾区| 洪湖市| 安岳县| 三原县| 苍南县|