Carved Marker

FSAA 簡介 [Part 3]

現在來看看 3D 繪圖晶片要怎麼處理這個問題。目前的 3D 晶片,幾乎都是用 by primitive 的方式畫出整個畫面的。所謂的 by primitive,就是指一次畫一個 primitive,把每一個 primitives 都畫好之後,整個場景就畫好了。Primitive 是指三角面和由許多三角面組成的簡單東西。這種方法和 ray tracing 或是 scanline renderer 是不一樣的。這兩者都是分別對畫面上的每個像點,去決定它應該會是什麼顏色。

另外,現在的 3D 繪圖晶片通常是利用 Z buffer 來去除隱藏面(即被其它三角面蓋住的部分),而不對三角面做任何排序動作。這當然是有原因的,因為如果對三角面做排序,再以「由後面往前面畫」的方式來去除隱藏面的話,有時就需要把某些三角面切開,還有一些很麻煩的東西,這樣的工作並不適合由記憶體很少的 3D 繪圖晶片來做。當然,讓 CPU 來做這個工作,速度也不會很快。無論如何,Z buffer(或是其它類似的方法)還是目前最有效率的方法之一。

現在來看看 3D 晶片要怎麼做到 anti-alias。一個最簡單的想法是,讓 3D 晶片在畫三角面的時候,就自動產生適當的「佔有率」數字,即這個三角面在某個特定的像點上,所佔有的面積的比例,而該像點的顏色則會乘上這個比例。這樣一來,就可以畫出平滑的三角面了。當然,對於三角面來說,三角面的內部像點所佔的面積比例當然都是 100%,只有在邊緣的地方才會有小於 100% 的佔有率。所以,這個方法也稱為 edge anti-alias。

不過,這個方法有一些問題。例如,當兩個三角面有重疊的時候,「佔有率」的計算就會出問題,因為 3D 晶片只知道將被蓋住的三角面,其佔有率的數字;但是,它卻沒辦法知道被蓋住的三角面,倒底是佔有哪些部分。最嚴重的問題,則是出現在三角面有交叉的時候。這時,因為交叉的地方是由 Z buffer 算出來的,所以根本沒辦法算出正確的「佔有率」數字。所以,除非三角面都沒有交叉,而且重疊的情形都還在合理範圍,不然的話,這個方法是不能用的。如果三角面都已經排序且切割過,那就可以使用這個方法。但是,就如同前面所說的,目前不太可能即時做這些動作。

如果需要畫的東西不是三角面,而只是線框的話,那麼 edge anti-alias 就很適用了。因為,線框很少會有交叉的現象(兩條線就算是交叉,也沒人會注意到吧!),而且,兩條線重疊的情形也不多。所以,edge anti-alias 非常適用在線框繪圖。某些應用像是 CAD/CAM 等等,特別常用到線框繪圖,所以他們會喜歡用 edge anti-alias。不過,對於模擬、視覺化、或是 3D 遊戲來說,線框繪圖很少用到,所以 edge anti-alias 就不太適用。

另外有一點要注意的是,edge anti-alias 只處理三角面的邊緣部分。當然高頻成分也是在邊緣最為明顯。但是,如果三角面有貼圖的話,還是可能會出現高頻成分。不過,一般來說,貼圖的 anti-alias 通常可以很容易用雙線性內插(bilinear interpolation)和 mipmap 來解決。這部分比較複雜,以後再特別討論。

說了這麼多,終於要說到 FSAA 了。為什麼叫 full scene 呢?它就是指對整個畫面做 anti-alias,而不是像 edge anti-alias 只是對某個 primitive(如三角面或是線)做 anti-alias。那麼,要怎樣對整個畫面來做 anti-alias?

一個簡單的方法,就是使用在每個像點中,取幾個 sub-sample 點,然後把這些 sub-sample 的顏色取平均值,做為這個像點的顏色。這樣的方法就稱為 super-sampling。很明顯的,這種做法完全不需要什麼特別的設計,不用切三角面,不用排序,直接就可以得到 anti-alias 的效果。所以這是一種 FSAA 的方法。

最簡單的 super-sampling 方法是 ordered grid super-sampling,簡稱 OGSS。所謂的 OGSS,就是把直接把解析度提高,再用 box filter 把它縮小。例如,假設要對 640×480 的解析度,做 4 個 sample 的 FSAA,那就把解析度提高為 1280×960,畫出整個畫面,然後再用 box filter 把它縮小到 640×480。為什麼稱為 OGSS 是因為它的 sub-sample 點等於是排成方形,如下圖所示:

OGSS Figure

上圖中,左邊是原來的解析度方式,大的灰色圓點是原來的取樣點。放大解析度為四倍之後(每邊各兩倍),會變成右邊的情形。這時,在新的解析度下,新的取樣點是紅色小點。對每個原來的像點來說,它會取內部的四個紅色小點的平均值,做為它的取樣值。所以,這些紅色小點就是它的 sub-sample 點。可以看出,它的 sub-sample 點正是排成方形,所以才會叫做 OGSS。

[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