貼圖 filtering 與 MIP map 簡介 [Part 4]
現在我們來看一些 MIP map 的例子。假設現在路邊有三個一模一樣的路標,路標如下圖:
現在把這樣的路標,在近、中、遠三個距離各放一個。如果只使用一般的 bilinear filtering,結果如下圖:
最前面的路標還算清楚,但是後面的兩個路標則變得亂七八糟。像是路標的白色邊緣,在後面的兩個路標就只顯示了一部分。如果使用了 MIP map 的話,結果就會好一些:
不過,如果對每個 pixel 只選擇某個 MIP map 的解析度,那可能會出現一些討厭的問題。在這裡用一條「路」做例子:
上圖中顯示出一條直路。它並沒有使用 MIP map,所以可以看到左邊的黃色斜線標誌在某個距離外,會出現一些環狀失真的現象。如果加上 MIP map,結果如下圖:
你可能會說:「哇!這是什麼鬼東西!」。很明顯的,它出現過度模糊的現象。不只如此,還可以看到令人討厭的接縫。這是因為在不同的距離,會需要不同解析度的貼圖。但是在轉換解析度的時候,並不能很平滑地轉換,所以才會出現接縫。
這個接縫的問題並不難解決,只要在兩個解析度的貼圖之間,也做線性的內插就可以了。這就是所謂的 trilinear filtering。它的結果如下圖:
可以看到,在使用 trilinear filtering 之後,雖然還是會有過度模糊的現象,但是至少接縫不見了。
為什麼會出現過度模糊的現象呢?這是因為這條路相對於觀察者來說,是相當「扁平」的。所以,它的一個 pixel 在貼圖上的 footprint 會變得很扁,比如說,可能是一個長寬比是 4:1 或更大的長方形。顯示晶片在決定要用哪個解析度的 MIP map 時,會選較低的解析度。所以,就會造成它在某個方向是適當的解析度,但是在另一個方向則會過度模糊。以上圖來說,在垂直方向的解析度是適當的,但是水平方向就不適當了。
一個簡單的方法,可以處理這個問題。我們可以強迫顯示晶片使用較高解析度的貼圖。比如說,如果我們知道 footprint 通常是在 4:1 左右的程度,那就可以強迫顯示晶片使用四倍解析度的貼圖。這稱為 MIP map 的 LOD bias。下面是兩個例子:
![]() |
![]() |
| LOD bias = -1.0 | LOD bias = -1.5 |
從上面的結果可知,設定 LOD bias 可以改善過度模糊的現象。但是,它同時也造成了失真。可以注意到左邊的黃色斜線標誌又出現一些環狀失真了。
所以 LOD bias 並不能解決所有的問題,而且它也只適用在一些特定的情形。不過,還有一個方法可以處理這種情形。如果我們已經知道某個貼圖的 footprint 總是很扁,而且知道它通常都會「扁」到某個程度(例如,4:1),那其實可以一開始就做一個很扁的貼圖。這對一些像是賽車遊戲的跑道特別有效。下面這個例子就是把路面的貼圖拉長為 4:1 後的結果:
它的效果很好。不過,這個方法只能用在方向是固定的情形,如果視角常常會轉動,那它可能反而會變得更為模糊。當然,對於一般視角變化不大的情形,像是一般的賽車遊戲,它是很不錯的做法。不過,對於像是第一人稱射擊、飛行模擬等視角變化較大的遊戲來說,這個方法就不見得這麼有用了。下圖是一個例子:
它在遠方的模糊情形仍相當不錯,並沒有明顯的過度模糊現象。但是在較近的地方,特別是黃色斜線標誌,就顯得過度模糊了。所以它並不是一個萬用的方法。
理想上的做法,是使用更多的 texel 來做 filtering。例如,如果 footprint 是一個 2:1 的長方形,那就取八個 texels 來做 filtering。如下圖:
上圖中,亮紅色和亮藍色方框,分別是兩個 pixel 對貼圖的 footprint。亮紅色方框的長寬比並不大,只涵蓋了四個 texels,所以用一般的 bilinear filtering 就夠了。但是亮藍色方框就不一樣了,它的長寬比約略是 2:1,並涵蓋了八個 texels。所以,用一般的 bilinear filtering,會選擇解析度較低的貼圖。因此,它大略會把接近灰色方框的範圍內的 texels 做平均,所以會產生過度模糊的現象。
要避免過度模糊的現象,最簡單的方法,就是直接取它所涵蓋的八個 texels 來做平均。當然,這樣需要的計算量就比一般的 bilinear filtering 要大了。因為通常是在長寬比大於 1 的時候,才會需要這樣的做法,所以又稱為 anisotropic filtering。
當然,一般來說,顯示晶片的硬體並不能無限制去取得 texels。例如,某個硬體可能只支援存取八個 texels(若使用 trilinear 則是 16 個)。而且,因為長寬比愈大,就可能會需要取得愈多的 texels 來進行平均,這樣也可能會讓效能受到很大的影響。所以,一般來說,我們會指定一個最大的長寬比。也就是說,顯示晶片只需要處理長寬比到某個程度,例如 2:1。若長寬比超過這個數字,就只好讓它變得過度模糊了。這個數字通常稱為 maximum level of anisotropy。
下圖是把最大的長寬比設為 2 的情形:
因為它只處理長寬比到 2:1 的情形,所以在遠方過度模糊的情形,和把 LOD bias 設為 -1 是完全一樣的。不過,和 LOD bias 不同的是,它並沒有在黃色斜線標誌上,產生環狀失真的情形。
下圖是把最大的長寬比設為 16 的情形:
![]() |
![]() |
可以看到幾乎所有的失真,包括過度模糊的現象,都已經消失了。這樣的確是可以產生非常高品質的貼圖效果。不過,它的缺點也是很明顯的:對每個貼圖來說,使用 trilinear filtering 的情形下,最多會需要讀取 128 個 texels。這會需要很多顯示記憶體的頻寬,因此會造成效能降低。而且,也不是所有的顯示晶片都支援到這麼高的 anisotropic filtering。例如,NVIDIA 的 GeForce 256 和 GeForce 2 系列顯示晶片,就只支援到長寬比為 2 的 anisotropic filtering。
[Part 1] [Part 2] [Part 3] [Part 4]
3/7/2001, Ping-Che Chen
Sorry, Traditional Chinese only. This page is encoded in UTF-8.
Copyright© 2000, 2001 Ping-Che Chen




