天天看點

關于常見的Sampling方式

什麼是Sampling,簡單說就是每個“像素塊”都是由無數個點來組成的,是以顯示出來的顔色也應該是由無數個點來決定的,但是現實是不可能真的把所有的點的顔色算出來,是以隻能取某一(或少數)點的顔色來作為代表,即Sampling(采樣)。

Sampling會有啥問題呢:Aliasing。這個詞的學術解釋比較抽象,對于圖形學這個方向來說,Aliasing可以簡單的認為是鋸齒(jaggies)以及摩爾條紋現象(moire patterns),是以後來的各種Sampling方法就是為了解決這兩個問題而出現的。

關于摩爾條紋的問題,這個是由于每個Sampling點在x方向和y方向的間隔是一樣的所導緻的,也就是說是那種Regular Samples而不是Random Samples

最為簡單粗暴的解決方法就是提高Sampling的次數,或者說是提高分辨率,但是缺點就是計算時間大幅度增加,這個在實際生産中是無法接受的,是以出現了其它的Sampling方式,既提升了品質,同時消耗的時間也不是很多。

那麼理論上怎樣的Sampling是好Sampling呢?即避免Aliasing呢?

1. 采樣點均勻地分布在像素塊之内,即不要聚成一堆(在二維層面上)。

2. 在一維層面上,也就是采樣點往x和y方向的上投影點需要均勻分布在x和y的線上,不要聚成一堆。

3. 采樣點之間存在某個最小的距離值。說白了還是不要聚成一堆。

以上三點是為了避免那種純粹的Random Samples設計的。

4. 不要用Regular Samples,雖然這個完全避免了以上三點,但是這個會造成摩爾條紋。

當然,如果采樣點足夠多的話,随便什麼樣的采樣方式都無所謂了。

常見的采樣方式:

1. n-rooks sampling

這個方法就像是把n個rooks(象棋裡的車)放在分成nxn的像素塊裡,然後每個rook在其所在橫豎行都沒有其它rook所在,即rooks之間無法互相“攻擊”。

這種采樣的好處就是在一維層面上能保證完全均勻,但是在二維層面上不能保證均勻分散不聚集。

2. jittered sampling

把像素塊分為nxn小格子,然後每個小格子裡面放一個采樣點,具體位置随機。

效果比較好,基本保證了不聚成一堆,同時還不是regular sampling

3. multi jittered sampling

第一種與第二種方法的結合。

同時能保證二維層面上與一維層面上的均勻分布。

參考:

Realistic Ray Tracing, Second Edition

http://web.cs.wpi.edu/~emmanuel/courses/cs563/S10/talks/wk3_p1_wadii_sampling_techniques.pdf

https://www.cs.cmu.edu/afs/cs/academic/class/15462-s09/www/lec/13/lec13.pdf

繼續閱讀