FSAA 簡介 [Part 4]
OGSS 有什麼缺點嗎?要看出它的缺點,得先看下面這張圖:
上圖中的這些三角面,顯示出邊線的角度和 aliasing 程度的關聯。從最左邊的三角形來看,可以看出完全垂直線、完全水平線和 45°的斜線,都不太會顯示出 aliasing。但是,接近垂直或接近水平的線,會顯示出最明顯的 aliasing。不幸的是,因為 OGSS 的 sub-sample 點是垂直和水平的排列,所以在處理接近垂直或水平的線時,通常只有兩個 sub-sample 會發生作用。如下圖所示:
在上圖中,當深藍色的三角形經過這些 sub-sample 點時,可以看出這三種方法,會得到明顯不同的結果。在兩個 OGSS 的例子中,每個像點都剛好有一半的 sub-sample 點包含在三角形裡面,所以它們的表現是完全相同的。當然,如果三角面再延長一些,4 samples 的 OGSS 的表現就會比 2 samples OGSS 要好一點。但是,這已經可以顯示出 OGSS 的表現,在接近垂直或接近水平的線,是不太好的。事實上,在線愈接近 45° 時,OGSS 的表現就會愈好。但是,前面也提過,45° 的線其 alias 的現象並不會很嚴重。再者,如果線真的是 45°,那 OGSS 的結果還是不會好,因為每個邊緣的像點,都會剛好有三個 sub-sample 點在三角面裡面(或外面),而正確的值應該是兩個。
如果把 sub-sample 點稍微轉動一下,情形就會改觀了。如果不希望在接近 45° 的時候會有較好的結果,那只要把 sub-sample 點轉動一些角度,就會讓接近垂直或水平的線對每個像點的 sub-sample 點「看起來」像是 45° 了。在上面的圖中就可以看到明顯的結果。因為 sub-sample 被轉動某個角度,所以這個方法稱為 rotate grid super-sampling,簡稱 RGSS。
很明顯的,RGSS 是不能用「提高解析度」這個方法來達成的。那要怎麼做到 RGSS 呢?基本上,方法並不難。只要在畫三角面的時候,把每個三角面稍微移動位置,這樣就和移動像點的取樣點,是同樣的效果。所以,要做到像上圖的 RGSS,只要把整個場景畫四次,每次都稍微移動每個三角面,到適當的取樣點位置(移動的範圍會小於一個像點的大小)。最後,再把這四張圖合起來,對每個像點取平均值,就可以得到結果了。傳統上,這可以利用 accumulation buffer 來達到。不過,accumulation buffer 需要很大的頻寬(每次從 frame buffer 複製到 accumulation buffer 需要兩次讀取和一次寫入),而且 accumulation buffer 通常需要比一般 frame buffer 更高的精確度才行,所以又需要更多頻寬。再加上 4 samples 的 FSAA 已經需要把整個場景畫出四次了,所以速度一定會很慢。
另一個方法是利用多個 frame buffer,這也是 3dfx 的 T-Buffer 的原理。這個方法是讓顯示晶片保有四個不同的 frame buffer,並把四個 sub-sample 的圖分別畫到這四個 frame buffer 中。而顯示晶片的 RAMDAC(把 frame buffer 輸出到螢幕上的裝置)則自動把這四個 frame buffer 的內容做平均。這樣一來,就不需要高精確度的 accumulation buffer,而且也沒有明顯的額外頻寬需求。因此,對於 sample 的數目很少的情形下,這的確是個取代 accumulation buffer 的好方法。
現在 DirectX 8 中的 DirectGraphics 也加入了 multi-sample buffer 的支援,基本上就和 3dfx 的 T-Buffer 是完全相同的。所以,將來的 3D 顯示晶片都很可能會支援這樣的功能。
附註:對這個主題有興趣的讀者,可以參考由 Beyond3D 的 Kristof Beets 和 Dave Barron 所寫的 Super-sampling Anti-aliasing Analysis 這篇 whitepaper。
[Part 1] [Part 2] [Part 3] [Part 4]
1/18/2001, Ping-Che Chen
Sorry, Traditional Chinese only. This page is encoded in UTF-8.
Copyright© 2000, 2001 Ping-Che Chen
