• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當(dāng)自強(qiáng)而不息

            【ZT】FSAA 簡(jiǎn)介

            臺(tái)灣人寫的,看起來(lái)真不習(xí)慣。

             

            文檔簡(jiǎn)介:
            FSAA 是 full scene anti-alias 的縮寫,有些人將其譯為全景反鋸齒,還算是合理。不過(guò),倒底 FSAA 是什么呢?為什么要「全景」(full scene)?「半景」不行嗎?(其實(shí)相對(duì)于 FSAA 的是 edge AA,「邊緣反鋸齒」)反鋸齒(anti-alias)又是怎么回事呢?

            文檔內(nèi)容:

            [Part 1]

            要弄清楚什么是 FSAA,就得先從 AA(anti-alias)開始。要弄清楚 AA,只好說(shuō)明一下取樣(sampling)這個(gè)麻煩的東西了。對(duì)于電腦繪圖有些瞭解的讀者,應(yīng)該已經(jīng)知道,目前的電腦繪圖使用的是 2D raster 的顯示方式。也就是說(shuō),畫面是由一大堆有不同顏色和不同亮度的小點(diǎn),組成一個(gè)大的方陣。這些小點(diǎn)稱為像點(diǎn),即 pixel,pixel 是 picture element 的縮寫。很明顯的,像點(diǎn)的數(shù)目愈多,圖形就會(huì)愈細(xì)緻。我們常說(shuō)的解析度就是指這些像點(diǎn)的數(shù)目。例如,640×480 這個(gè)解析度,就表示畫面是由 307,200 個(gè)像點(diǎn)所組成的。

             
            注:解析度在某些領(lǐng)域有不同的意義。在印刷的情形下,一般所謂的解析度,通常是以 DPI(dots per inch)為單位,即每英吋中含多少個(gè)點(diǎn)。像是某個(gè)印表機(jī),若有 600 DPI 的解析度,就表示它每英吋可以包含 600 個(gè)點(diǎn)。所以,在一張 8.5"×11" 的紙上,就會(huì)有 5,100×6,600 = 33,660,000 個(gè)點(diǎn)。當(dāng)然,紙愈大的話,點(diǎn)的數(shù)目就可以愈多,這是因?yàn)辄c(diǎn)的大小是固定的。在顯示幕的情形下,不管螢?zāi)挥卸啻螅褂?640×480 這個(gè)解析度時(shí),像點(diǎn)的數(shù)目都是 307,200 個(gè),這和印刷的情形是不同的。當(dāng)然,通常愈大的螢?zāi)荒苋菰S愈高的像點(diǎn)數(shù)目。


            當(dāng)然,像點(diǎn)的數(shù)目是有限多的。不幸的是,這個(gè)世界并不是由有限的小點(diǎn)組成的。好吧!也許它是由有限的小點(diǎn)組成,但是這些小點(diǎn)的數(shù)目非常的多,所以以人類巨大的眼睛來(lái)看,就好像是完全連續(xù)的一樣。這樣一來(lái),用有限的像點(diǎn)來(lái)表現(xiàn)畫面,就會(huì)出現(xiàn)問(wèn)題。但是,只要像點(diǎn)的數(shù)目夠多,而且像點(diǎn)的大小夠小,小到人類的眼睛無(wú)法分辨的情形下,不就沒(méi)問(wèn)題了嗎?當(dāng)然會(huì)有問(wèn)題,不然就不需要 FSAA 了。


            問(wèn)題在哪裡呢?問(wèn)題在于取樣的方式。取樣是指把一個(gè)連續(xù)的訊號(hào),轉(zhuǎn)換成不連續(xù)(離散)的訊號(hào)的動(dòng)作。因?yàn)橄顸c(diǎn)的數(shù)目是有限多的,所以它一定是不連續(xù)的,所以當(dāng)然就需要這個(gè)取樣的動(dòng)作了。下圖是一個(gè)取樣的例子:
             

            Sampling figure

            上圖中,黑色的曲線是原始訊號(hào),灰色是直線是取樣點(diǎn),下圖則是取樣的結(jié)果。簡(jiǎn)單的說(shuō),就是把曲線上面每個(gè)取樣點(diǎn)(就是那些灰色直線所在的地方)的數(shù)值取出來(lái),這樣就是取樣的動(dòng)作。一般來(lái)說(shuō),取樣點(diǎn)之間的距離是固定的。以電腦圖形的例子來(lái)看,每個(gè)像點(diǎn)就是取樣點(diǎn)。不過(guò),電腦圖形是從一個(gè)二維的訊號(hào)中,取樣得到一個(gè)二維的陣列。所以,取樣看起來(lái)是會(huì)損失資訊的。另外,因?yàn)殡娔X是以數(shù)位的方式存放資料,所以還要把取樣的結(jié)果進(jìn)行數(shù)位化。數(shù)位化可以看成是「轉(zhuǎn)成整數(shù)」的動(dòng)作。例如,假設(shè)訊號(hào)的范圍是 0 ~ 1 之間,想要數(shù)位化成 8 位元的資料,就是先把它乘上 255(8 位元數(shù)字可以表示 0 ~ 255 的范圍),然后把結(jié)果以四捨五入或是直接捨去的方式轉(zhuǎn)成整數(shù)。這個(gè)動(dòng)作當(dāng)然也會(huì)損失資訊。不過(guò),這部分和我們的主題無(wú)關(guān)。


            取樣會(huì)牽扯到很多複雜的定理。例如,在做取樣之前,如果先經(jīng)過(guò)一個(gè) low pass filter,把高頻的部分濾掉,再設(shè)定適當(dāng)?shù)娜宇l率(通常是比是最高頻率的兩倍還大)。這樣處理過(guò)的訊號(hào)再去取樣,就可以完整還原到原來(lái)的訊號(hào)(指經(jīng)過(guò) low pass filter 后的訊號(hào),而不是最原始的訊號(hào))。當(dāng)然,這篇文章并不是什麼教材,所以不會(huì)深入這些地方。不過(guò),low pass filter 等一下會(huì)用到,所以先記著比較好。


            [Part 2]

            現(xiàn)在我們來(lái)看看,在電腦繪圖中,取樣的情形是什麼樣子。為了簡(jiǎn)單起見,我們用兩個(gè)三角形來(lái)做例子。如下圖:
             

            Two triangles

            上圖中,灰色的線是像點(diǎn)的邊界,當(dāng)然,實(shí)際上像點(diǎn)是不會(huì)有什麼邊界的,就算有也很細(xì),不會(huì)這麼粗。這些邊界只是示意用的。每個(gè)像點(diǎn)中的小黑點(diǎn)就是取樣點(diǎn)。取樣的時(shí)候,就是取這些小黑點(diǎn)上面的顏色,做為整個(gè)像點(diǎn)的顏色。所以,取樣的結(jié)果如下圖:

            Two sampled triangles

            我想大家應(yīng)該都看到鋸齒現(xiàn)象了吧!這就是一般 3D 繪圖中所遇到的情形。為什麼會(huì)這樣呢?其實(shí),這是因?yàn)槲覀冊(cè)谌又埃倭艘粋€(gè)步驟:low pass filter。因此,原來(lái)訊號(hào)中的高頻部分并沒(méi)有去掉,所以才會(huì)出現(xiàn)鋸齒現(xiàn)象。對(duì)了,所謂的 low pass filter,就是指一個(gè)只能讓低頻成分通過(guò)的過(guò)濾器。詳細(xì)的細(xì)節(jié)就不在這裡說(shuō)明了。現(xiàn)在只要記住一件事就夠了:box filter 是一種 low pass filter。也就是說(shuō),如果我們把一個(gè)像點(diǎn)的范圍內(nèi),所包含的訊號(hào)取其平均值的話,這樣就會(huì)是一個(gè) low pass filter。經(jīng)過(guò)這樣的動(dòng)作,再來(lái)做取樣,會(huì)得到下圖:

            Two box filtered triangles

            把上面的兩個(gè)例子都縮小到實(shí)際的大小,會(huì)得到下圖:

            The sampled images in actual size

            兩者之間的差異應(yīng)該是相當(dāng)明顯吧!


            有些讀者可能會(huì)對(duì) low pass filter 有疑問(wèn)。為什麼用了 low pass filter 消除高頻成分就會(huì)有比較好的效果呢?實(shí)際的理論相當(dāng)複雜,所以不在這裡多說(shuō)。不過(guò),如果以人眼實(shí)際上的觀察方式來(lái)看,倒是很合理的。因?yàn)椋搜蹆?nèi)部的感光細(xì)胞,是會(huì)收集它的感光范圍中的所有能量,再送到腦部。所以,可以看成感光細(xì)胞其實(shí)就已經(jīng)包含了一個(gè) box filter。因此,在進(jìn)行取樣之前,先做 box filter 是很合理的做法。


            有一點(diǎn)要特別注意:如果顯示系統(tǒng)的解析度非常的高,遠(yuǎn)遠(yuǎn)超出人眼可以分辨的范圍,那麼 anti-aliasing 的效果就會(huì)慢慢消失。以一般習(xí)慣上的閱讀距離來(lái)說(shuō),人眼很難分辨超過(guò) 300 DPI 以上的彩色點(diǎn)。也就是說(shuō),對(duì)一個(gè)對(duì)角線為 15" 的顯示器來(lái)說(shuō),如果解析度高達(dá) 3,600×2,700 的話,那就沒(méi)有做 anti-alias 的必要了,反正人的眼睛也沒(méi)辦法看到這麼細(xì)的像點(diǎn)。不過(guò),貼圖的 filtering 是不同的事,無(wú)論解析度有多高,都需要適當(dāng)?shù)馁N圖 filtering 才不會(huì)出現(xiàn)不正常的情形。

            [Part 3]

            現(xiàn)在來(lái)看看 3D 繪圖晶片要怎麼處理這個(gè)問(wèn)題。目前的 3D 晶片,幾乎都是用 by primitive 的方式畫出整個(gè)畫面的。所謂的 by primitive,就是指一次畫一個(gè) primitive,把每一個(gè) primitives 都畫好之后,整個(gè)場(chǎng)景就畫好了。Primitive 是指三角面和由許多三角面組成的簡(jiǎn)單東西。這種方法和 ray tracing 或是 scanline renderer 是不一樣的。這兩者都是分別對(duì)畫面上的每個(gè)像點(diǎn),去決定它應(yīng)該會(huì)是什麼顏色。


            另外,現(xiàn)在的 3D 繪圖晶片通常是利用 Z buffer 來(lái)去除隱藏面(即被其它三角面蓋住的部分),而不對(duì)三角面做任何排序動(dòng)作。這當(dāng)然是有原因的,因?yàn)槿绻麑?duì)三角面做排序,再以「由后面往前面畫」的方式來(lái)去除隱藏面的話,有時(shí)就需要把某些三角面切開,還有一些很麻煩的東西,這樣的工作并不適合由記憶體很少的 3D 繪圖晶片來(lái)做。當(dāng)然,讓 CPU 來(lái)做這個(gè)工作,速度也不會(huì)很快。無(wú)論如何,Z buffer(或是其它類似的方法)還是目前最有效率的方法之一。


            現(xiàn)在來(lái)看看 3D 晶片要怎麼做到 anti-alias。一個(gè)最簡(jiǎn)單的想法是,讓 3D 晶片在畫三角面的時(shí)候,就自動(dòng)產(chǎn)生適當(dāng)?shù)摹竵?zhàn)有率」數(shù)字,即這個(gè)三角面在某個(gè)特定的像點(diǎn)上,所佔(zhàn)有的面積的比例,而該像點(diǎn)的顏色則會(huì)乘上這個(gè)比例。這樣一來(lái),就可以畫出平滑的三角面了。當(dāng)然,對(duì)于三角面來(lái)說(shuō),三角面的內(nèi)部像點(diǎn)所佔(zhàn)的面積比例當(dāng)然都是 100%,只有在邊緣的地方才會(huì)有小于 100% 的佔(zhàn)有率。所以,這個(gè)方法也稱為 edge anti-alias。
            不過(guò),這個(gè)方法有一些問(wèn)題。例如,當(dāng)兩個(gè)三角面有重疊的時(shí)候,「佔(zhàn)有率」的計(jì)算就會(huì)出問(wèn)題,因?yàn)?3D 晶片只知道將被蓋住的三角面,其佔(zhàn)有率的數(shù)字;但是,它卻沒(méi)辦法知道被蓋住的三角面,倒底是佔(zhàn)有哪些部分。最嚴(yán)重的問(wèn)題,則是出現(xiàn)在三角面有交叉的時(shí)候。這時(shí),因?yàn)榻徊娴牡胤绞怯? Z buffer 算出來(lái)的,所以根本沒(méi)辦法算出正確的「佔(zhàn)有率」數(shù)字。所以,除非三角面都沒(méi)有交叉,而且重疊的情形都還在合理范圍,不然的話,這個(gè)方法是不能用的。如果三角面都已經(jīng)排序且切割過(guò),那就可以使用這個(gè)方法。但是,就如同前面所說(shuō)的,目前不太可能即時(shí)做這些動(dòng)作。
            如果需要畫的東西不是三角面,而只是線框的話,那麼 edge anti-alias 就很適用了。因?yàn)椋€框很少會(huì)有交叉的現(xiàn)象(兩條線就算是交叉,也沒(méi)人會(huì)注意到吧!),而且,兩條線重疊的情形也不多。所以,edge anti-alias 非常適用在線框繪圖。某些應(yīng)用像是 CAD/CAM 等等,特別常用到線框繪圖,所以他們會(huì)喜歡用 edge anti-alias。不過(guò),對(duì)于模擬、視覺化、或是 3D 游戲來(lái)說(shuō),線框繪圖很少用到,所以 edge anti-alias 就不太適用。

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


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


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


            最簡(jiǎn)單的 super-sampling 方法是 ordered grid super-sampling,簡(jiǎn)稱 OGSS。所謂的 OGSS,就是把直接把解析度提高,再用 box filter 把它縮小。例如,假設(shè)要對(duì) 640×480 的解析度,做 4 個(gè) sample 的 FSAA,那就把解析度提高為 1280×960,畫出整個(gè)畫面,然后再用 box filter 把它縮小到 640×480。為什麼稱為 OGSS 是因?yàn)樗? sub-sample 點(diǎn)等于是排成方形,如下圖所示:

             

            OGSS figure

            上圖中,左邊是原來(lái)的解析度方式,大的灰色圓點(diǎn)是原來(lái)的取樣點(diǎn)。放大解析度為四倍之后(每邊各兩倍),會(huì)變成右邊的情形。這時(shí),在新的解析度下,新的取樣點(diǎn)是紅色小點(diǎn)。對(duì)每個(gè)原來(lái)的像點(diǎn)來(lái)說(shuō),它會(huì)取內(nèi)部的四個(gè)紅色小點(diǎn)的平均值,做為它的取樣值。所以,這些紅色小點(diǎn)就是它的 sub-sample 點(diǎn)。可以看出,它的 sub-sample 點(diǎn)正是排成方形,所以才會(huì)叫做 OGSS。
            [Part 4]



            OGSS 有什麼缺點(diǎn)嗎?要看出它的缺點(diǎn),得先看下面這張圖:

             

            Test figures with aliasing

            上圖中的這些三角面,顯示出邊線的角度和 aliasing 程度的關(guān)聯(lián)。從最左邊的三角形來(lái)看,可以看出完全垂直線、完全水平線和 45°的斜線,都不太會(huì)顯示出 aliasing。但是,接近垂直或接近水平的線,會(huì)顯示出最明顯的 aliasing。不幸的是,因?yàn)?OGSS 的 sub-sample 點(diǎn)是垂直和水平的排列,所以在處理接近垂直或水平的線時(shí),通常只有兩個(gè) sub-sample 會(huì)發(fā)生作用。如下圖所示:

            The performance of ogss and rgss

            在上圖中,當(dāng)深藍(lán)色的三角形經(jīng)過(guò)這些 sub-sample 點(diǎn)時(shí),可以看出這三種方法,會(huì)得到明顯不同的結(jié)果。在兩個(gè) OGSS 的例子中,每個(gè)像點(diǎn)都剛好有一半的 sub-sample 點(diǎn)包含在三角形裡面,所以它們的表現(xiàn)是完全相同的。當(dāng)然,如果三角面再延長(zhǎng)一些,4 samples 的 OGSS 的表現(xiàn)就會(huì)比 2 samples OGSS 要好一點(diǎn)。但是,這已經(jīng)可以顯示出 OGSS 的表現(xiàn),在接近垂直或接近水平的線,是不太好的。事實(shí)上,在線愈接近 45° 時(shí),OGSS 的表現(xiàn)就會(huì)愈好。但是,前面也提過(guò),45° 的線其 alias 的現(xiàn)象并不會(huì)很嚴(yán)重。再者,如果線真的是 45°,那 OGSS 的結(jié)果還是不會(huì)好,因?yàn)槊總€(gè)邊緣的像點(diǎn),都會(huì)剛好有三個(gè) sub-sample 點(diǎn)在三角面裡面(或外面),而正確的值應(yīng)該是兩個(gè)。


            如果把 sub-sample 點(diǎn)稍微轉(zhuǎn)動(dòng)一下,情形就會(huì)改觀了。如果不希望在接近 45° 的時(shí)候會(huì)有較好的結(jié)果,那只要把 sub-sample 點(diǎn)轉(zhuǎn)動(dòng)一些角度,就會(huì)讓接近垂直或水平的線對(duì)每個(gè)像點(diǎn)的 sub-sample 點(diǎn)「看起來(lái)」像是 45° 了。在上面的圖中就可以看到明顯的結(jié)果。因?yàn)? sub-sample 被轉(zhuǎn)動(dòng)某個(gè)角度,所以這個(gè)方法稱為 rotate grid super-sampling,簡(jiǎn)稱 RGSS。


            很明顯的,RGSS 是不能用「提高解析度」這個(gè)方法來(lái)達(dá)成的。那要怎麼做到 RGSS 呢?基本上,方法并不難。只要在畫三角面的時(shí)候,把每個(gè)三角面稍微移動(dòng)位置,這樣就和移動(dòng)像點(diǎn)的取樣點(diǎn),是同樣的效果。所以,要做到像上圖的 RGSS,只要把整個(gè)場(chǎng)景畫四次,每次都稍微移動(dòng)每個(gè)三角面,到適當(dāng)?shù)娜狱c(diǎn)位置(移動(dòng)的范圍會(huì)小于一個(gè)像點(diǎn)的大小)。最后,再把這四張圖合起來(lái),對(duì)每個(gè)像點(diǎn)取平均值,就可以得到結(jié)果了。傳統(tǒng)上,這可以利用 accumulation buffer 來(lái)達(dá)到。不過(guò),accumulation buffer 需要很大的頻寬(每次從 frame buffer 複製到 accumulation buffer 需要兩次讀取和一次寫入),而且 accumulation buffer 通常需要比一般 frame buffer 更高的精確度才行,所以又需要更多頻寬。再加上 4 samples 的 FSAA 已經(jīng)需要把整個(gè)場(chǎng)景畫出四次了,所以速度一定會(huì)很慢。


            另一個(gè)方法是利用多個(gè) frame buffer,這也是 3dfx 的 T-Buffer 的原理。這個(gè)方法是讓顯示晶片保有四個(gè)不同的 frame buffer,并把四個(gè) sub-sample 的圖分別畫到這四個(gè) frame buffer 中。而顯示晶片的 RAMDAC(把 frame buffer 輸出到螢?zāi)簧系难b置)則自動(dòng)把這四個(gè) frame buffer 的內(nèi)容做平均。這樣一來(lái),就不需要高精確度的 accumulation buffer,而且也沒(méi)有明顯的額外頻寬需求。因此,對(duì)于 sample 的數(shù)目很少的情形下,這的確是個(gè)取代 accumulation buffer 的好方法。


            現(xiàn)在 DirectX 8 中的 DirectGraphics 也加入了 multi-sample buffer 的支援,基本上就和 3dfx 的 T-Buffer 是完全相同的。所以,將來(lái)的 3D 顯示晶片都很可能會(huì)支援這樣的功能。


            附注:對(duì)這個(gè)主題有興趣的讀者,可以參考由 Beyond3D 的 Kristof Beets 和 Dave Barron 所寫的 Super-sampling Anti-aliasing Analysis 這篇 whitepaper。
             

            posted on 2007-05-14 00:40 lovedday 閱讀(1657) 評(píng)論(2)  編輯 收藏 引用 所屬分類: ■ 3D Graphics And Software Engine

            評(píng)論

            # re: 【ZT】FSAA 簡(jiǎn)介[未登錄](méi) 2007-10-19 00:23 flyman

            well,介紹的很好。  回復(fù)  更多評(píng)論   

            # re: 【ZT】FSAA 簡(jiǎn)介 2008-03-08 08:50 七星重劍

            勝讀十年書  回復(fù)  更多評(píng)論   

            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            99久久精品国产高清一区二区 | 无码人妻久久一区二区三区免费| 久久无码一区二区三区少妇| 伊人久久大香线蕉成人| 久久精品无码一区二区无码| 国产精品久久久天天影视香蕉| 亚洲精品国精品久久99热| 久久人人爽人人爽人人片av麻烦 | 色综合合久久天天给综看| 伊人久久无码中文字幕| 久久国产精品久久| 久久精品国产男包| 91精品无码久久久久久五月天| 久久热这里只有精品在线观看| 免费国产99久久久香蕉| 久久天天躁狠狠躁夜夜2020一 | 久久亚洲中文字幕精品有坂深雪 | 久久久精品国产亚洲成人满18免费网站 | 久久久久女人精品毛片| 免费国产99久久久香蕉| 欧洲精品久久久av无码电影| 亚洲中文字幕伊人久久无码| 国产三级观看久久| 99久久精品国产免看国产一区| 伊人久久综合精品无码AV专区| 日本亚洲色大成网站WWW久久| 久久亚洲高清观看| 潮喷大喷水系列无码久久精品| 亚洲AV无一区二区三区久久| 精品久久久无码21p发布| 蜜桃麻豆www久久国产精品| 精品久久久久久无码中文字幕| 日韩欧美亚洲综合久久影院d3| 久久精品国产久精国产思思| 亚洲午夜久久久久久久久电影网| 精品伊人久久久| 久久精品国产AV一区二区三区| 国产99久久久国产精品小说| 久久天天躁夜夜躁狠狠躁2022| 久久久久亚洲av成人网人人软件 | 欧美久久久久久午夜精品|