专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »游戏开发 » antialiasing:Antialiasing 的理論 »正文

antialiasing:Antialiasing 的理論

来源: 发布时间:星期四, 2008年9月25日 浏览:58次 评论:0
目录:
   Part 1
   Part 2
   Part 3
   Part 4

文档内容:
[Part 1]

在這篇文章中,我們會從數位訊號處理的理論角度來看 3D 電腦繪圖中的 antialiasing 問題。當然,這並不是教科書(我也沒能力寫教科書 :P),所以我會儘可能避開數學式,而只是從觀念的角度來說明這個問題。

首先,我們從數位訊號的基礎來看。因為我們現在所用的電腦,幾乎都是數位電腦,所以它們當然也只能處理數位的資料。所謂的數位資料,其實就是一堆數字,或更正確的說,一堆整數。因為數位電腦只能處理 0 和 1,所以它們所能處理的東西,可以說都是有限的整數。當然,我們可以用一些整數來表示有理數(用分數來表示),所以數位電腦也可以用來處理一些小數。

不過,有很多東西不是用有理數就可以表示的。不過,這還不是最大的問題。最大的問題是,很多訊號都是連續的。這裡所謂的連續,並不是微積分裡面的那種連續,而只是說訊號就像一個實數函數一樣,在任何參數上都有值。這告訴我們,即使是隨便一小段訊號,都需要用無限多個數字才能表示。很明顯的,數位電腦是不能存放無限多個數字的。下圖是一個例子:

\"An

在上圖中,垂直方向是訊號的強度,在影像中就是 intensity。而水平方向則是訊號的位置,我們稱為 spatial domain。如果是聲音訊號的話,那它就不是位置,而是時間了,也就是 time domain。不過,因為我們這裡只討論影像,所以基本上水平方向就是 spatial domain。

不過,因為這樣的訊號是連續的,所以,就像前面所說的,需要無限多個數字才能存放這個訊號。但是電腦不能存放無限多個數字,所以,只好取其中的一些數字。比如說,如果上圖中垂直方向的虛線,就是 pixel 的邊界,那我們可以只取訊號中,在 pixel 正中間的值。這樣我們只需要存放八個數字。這就是所謂的取樣(sampling)。以上例來說,取樣得到的八個數字分別是 0.548、0.468、0.760、0.296、0.400、0.348、0.460、和 0.507。這些取樣得到的數字,就形成了數位訊號

這些數位訊號在經過處理後(所謂的處理,也許只是存放在某個地方,像是光碟片裡面),最後還是需要讓人看到結果。因為人是沒辦法光從一堆數字就看得出來那是什麼東西,所以,一定要設法把這些數位訊號,再轉換成連續的、人可以接受訊號(像是顯示在螢幕上,或是對聲音訊號來說,用喇叭發出聲音)。這個過程就稱為重建(reconstruction)。比如說,上面的數位訊號,利用 sample and hold 的方式重建的話(也就是說,在整個 pixel 的範圍中,都輸出該 pixel 的取樣值),會變成如下圖:

\"Reconstruction

不用說,這是一個蠻差的重建方式,因為它重建出來的訊號,和原來的訊號實在是相差太多了。不過,其實這也是沒辦法的事,因為對一個連續的訊號(原來需要無限多個數字才能表示),只用八個數字來表示,本來就會丟失很多資訊。不過,我們當然還是希望能夠儘可能達到最好的效果。這就是理論發揮作用的時候了。


[Part 2]

究竟在取樣的時候,發生了什麼事呢?這就得從 frequency domain 的角度來看了。所謂的 frequency domain,就是指訊號所擁有的各種頻率的成份。也就是說,我們可以用一大堆不同頻率的正弦波,合成我們所要的訊號。或是說,我們要找出我們所要的訊號,是由哪些不同頻率、不同強度、和不同相位的正弦波所組成的。這可以利用 Fourier transform 把一個訊號從 spatial domain 或 time domain 轉換成 frequency domain,或利用 inverse Fourier transform 把它從 frequency domain 轉回來。

下圖是一個訊號和它的 Fourier transform:

\"Original \"Frequency

要注意的是,一個訊號的 Fourier transform,對任一個頻率實際上有兩個成份,一個是訊號的強度(magnitude),另一個是相位(phase)。在上圖中只顯示出強度,而沒有顯示出相位。另外,在頻率為 0 的地方,稱為 DC,等於是整個訊號在 spatial domain(或 time domain)的總合,所以特別大。在後面的圖中,有時會把 DC 值切掉,以讓其它頻率的值更容易看出來。

假設現在要對一個訊號在每個 pixel 的中間進行取樣,也就是保留訊號在 pixel 中間的值,而把其它地方的值變成 0。這其實可以利用乘上另一個訊號的方式來做,也就是乘上一個「在每個 pixel 中間為 1、其它地方為 0」的訊號。如下圖所示:

\"Original\"Comb\"Sampled
原始訊號Comb filter取樣後的訊號

上圖是一個原始訊號,在乘上 comb filter 後,得到取樣後的訊號。Comb filter 的名字來自於它的形狀,因為它在每個 pixel 中間的值為 1,其它地方的值為 0,看起來長得像梳子,所以叫 comb filter。

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: