貼圖 filtering 與 MIP map 簡介 [Part 2]
重新取樣的第一個動作,就是要重建原來的訊號。如果重建訊號的動作不正確,就會在重新取樣的時候,造成失真的問題。按照訊號處理的理論,我們知道取樣後的訊號,只要其取樣頻率大於訊號頻率的兩倍(即 Nyquist frequency),就可以重建出原來的訊號。這在許多領域都常被使用,包括聲音處理的領域。在數位圖形的情形下又是如何呢?下面是一個例子:
![]() |
![]() |
| 原始訊號 | 重建訊號(使用 60x60 sinc filter) |
可以看到重建出來的訊號有很嚴重的 ringing effect。這是二維訊號難以避免的結果。不過,用這種方法重建出來的訊號,倒是沒有什麼嚴重的 aliasing 問題。然而,利用這種方法重建訊號,是不太可能即時進行的,因為計算量實在是太大了。以上圖為例,上圖使用 60x60 的 sinc filter,所以對每個重新取樣的點,都需要做 60x60 個取樣點的計算。這樣的計算量是非常大的。
除了重建訊號的問題之外,如果重新取樣是縮小的取樣,也就是取樣點的間距變大的話,還需要一個額外的切除高頻成份的動作。這部分比較複雜,所以這裡先以放大的重新取樣為主。
為了要能夠快速重建出訊號,一定要使用簡單的運算。最簡單的運算,當然就是在重新取樣的時候,直接取距離最近的取樣點。因此,這個方法稱為 nearest sampling。因為只取一個取樣點,所以有時也稱為 point sampling。它的結果當然不會太好,而且還會產生新的失真問題。
其實 point sampling 也可以看成利用零次多項式(即常數多項式)去逼近的方法。所以,一個很自然的想法,就是用一次多項式去逼近,也就是線性內插(linear interpolation)。下圖是線性內插的示意圖:
如果是在二維的訊號(像是 2D 貼圖)上,那就要同時對兩個方向都做線性內插,所以稱為雙線性內插(bilinear interpolation)。
使用雙線性內插的時候,每個取樣點需要取 2x2 個點來計算,所以計算量並不大。不過,線性內插的問題在於,它所產生的結果並非平滑的,所以在某些情形下,表現並不好。例如,下圖的例子中,字母 D 的右下角部分,以線性內插產生的結果,就還是有一些鋸齒狀的現象。
如果再提高逼近的次數,就是以三次多項式來逼近了,稱為 cubic interpolation。在二維的情形下,稱為 bicubic interpolation。三次內插有很多不同的型式,不過,對每個取樣點,它都需要 4x4 的計算。就目前的 3D 硬體來說,計算量已經是相當大,所以極少有 3D 硬體支援這種內插方式。不過,三次內插會產生平滑的訊號,所以一般來說,效果比線性內插要好一些。
下面是 point sampling、bilinear interpolation 和 bicubic interpolation 的例子。
![]() |
![]() |
![]() |
| Point sampling | Bilinear interpolation | Bicubic interpolation |
一般來說,因為 bilinear interpolation 的效果已經相當不錯,再加上計算量又少,所以一般 3D 顯示晶片都是使用 bilinear interpolation 來處理貼圖的重新取樣問題,特別是在放大的部分。
[Part 1] [Part 2] [Part 3] [Part 4]
2/7/2001, Ping-Che Chen
Sorry, Traditional Chinese only. This page is encoded in UTF-8.
Copyright© 2000, 2001 Ping-Che Chen





