1. 程式人生 > 其它 >GAMES101-06- Rasterization光柵化2 (Antialiasing and Z-Buffering)

GAMES101-06- Rasterization光柵化2 (Antialiasing and Z-Buffering)

Rasterization光柵化2 (Antialiasing and Z-Buffering)

Antialiasing反走樣

Sampling theory

首先採樣是廣泛存在的,而取樣產生的問題也是廣泛存在的。

Sampling Artifacts取樣瑕疵
Jaggies鋸齒——sampling in space
Moire Patterns——undersampling images

右側的圖省略了奇數行與列。

Wagon wheel effect——sampling in time

圓盤順時針旋轉,但為什麼在人眼看的時候會發現有的部分在逆時針旋轉?

答:這是因為人眼在時間上的取樣跟不上圓盤運動的速度。

Antialiasing Idea:Blurring(Pre-Filtering)Before Sampling

取樣前先模糊處理的實際應用效果舉例如下圖:

模糊前——

模糊後——

上面的示例是先模糊後取樣,那麼考慮先採樣後模糊行不行呢?

答:不行,舉例如下:

那麼想要直到為什麼反過來不行,就要學習一些頻域的知識了。

Frequency Domain頻域

首先回顧一下微積分的知識,微積分展開中有一種傅立葉級數展開,可以將一個函式用sin和cos的形式表示。

而傅立葉級數展開與傅立葉變換是緊密相連的,下圖中就是傅立葉變換和逆傅立葉變換:

從下圖中的\(f(x)\)展開來理解傅立葉變換:

可以知道傅立葉變換其實就是把函式分解成不同頻率的段。

如下圖左側是\(f(x)\)中各項各自的函式影象,右側是\(f(x)\)各項之和的函式影象:

可以說,傅立葉變換可以把函式從時域變換到頻域

對下圖進行分析,來理解取樣瑕疵產生的根本原因(取樣速度跟不上訊號變化):

從上到下函式的頻率逐漸增大,假設用完全相同的取樣方法(每間隔圖中豎虛線進行取樣)對這些函式進行取樣。觀察\(f_1(x)\)的取樣情況,我們可以觀察出原來函式大概的形狀;同理觀察\(f_2(x)\)\(f_3(x)\)的取樣情況也是這樣。但這種情況到\(f_4(x)\)\(f_5(x)\)的時候就不太妙了,對取樣訊號連起來會發現跟原來函式形狀相差甚遠。

這說明什麼呢?

答:通過對上面取樣頻率和函式頻率的一個分析可以知道,如果說函式本身頻率很高,像\(f_5(x)\),而取樣頻率很低,這就跟不上函式的變化,就沒辦法恢復原始訊號。

走樣的正式定義

答:如下圖例子,同樣的取樣方法取樣兩種不同頻率的函式得出來的結果我們無法區分,這就叫走樣。

Filtering濾波

濾波是什麼意思呢?

答:就是把某些特定的頻率給抹掉,看對應的訊號發生的變化。(這時候傅立葉變換將時域變換為頻域的作用就很重要了,具體變換如下圖)

右側就是左側圖變換為頻域的結果,怎麼理解右側圖呢?

答:可以看到右側圖的中心,我們把中心定義為最低頻的區域,然後周圍定義為高頻的區域。在不同區域上頻域表示的資訊,我們用亮度來表示。針對這張右側圖,那麼可以看出大多數的資訊都是集中在低頻的區域,因為中間比較亮。當然高頻資訊也有,只是相對低頻來說比較少。

為什麼右側圖中有個非常明顯的“十”字呢?

答:簡單解釋,就是我們在分析一個訊號的時候,我們會認為這是一個週期性重複的訊號。但是對於圖來說很少有重複的,所以我們認為這張圖到了右邊界的時候又會重複這張圖的左邊的內容(可以看作是把這張圖水平上疊放了好幾張,豎直方向上也被疊放了好幾張)。而正常情況下很少有圖片的右邊界和左邊界完全一致,如果我們把這張圖從左搬到右邊(影象左邊界跟影象右邊界挨在一塊),那麼在這條邊界上就會發生劇烈的訊號變化,也就會產生一個極其高的高頻。(我們一般都是分析圖內部的事情,就忽略這兩條“十”字的線)

High-pass filter高通濾波

此時我們做一個操作,將圖的低頻區域給抹掉(這種濾波,叫高通濾波),如下:

那麼這個時候想要看圖片變成什麼樣,就做一次逆傅立葉變換得到圖片如下:

這樣一來,就會知道對這張圖而言高頻就是影象內容的邊界。進一步理解,邊界可以認為就是圖中內容左右兩邊發生鉅變的地方,跟上方介紹“十”字出現的原因——左邊界與有邊界極大不同導致訊號劇烈變化一樣,影象內容的邊界也會導致訊號的劇烈變化,那這邊界就是高頻資訊。

Low-pass filter低通濾波

這回如下圖所示,我們只留下了低頻資訊,抹去了其他高頻資訊:

同樣做逆傅立葉變換操作,得到下圖:

可以看出這張圖就忽略了很多細節,只能看到大概模糊的影象。從上方高通濾波對邊界的分析可以知道,將高頻資訊抹去,意味著將邊界資訊抹去,從這個角度上看,低通濾波處理的影象結果確實是沒有了邊界資訊。

Band-pass filter帶通濾波

如下圖,我們將高低頻區域都抹去,只保留一部分不低不高的部分:

此時做逆傅立葉變換得到下圖:

可以看到圖中可以稍微看出邊界和中間一部分色塊。

將不低不高區域放大:

得到逆傅立葉變換結果如下,因為高頻區域變多一些,所以邊界就又清晰了一點:

Filtering=Convolution卷積(=Averageing平均)
卷積概念

這一部分,跟上一部分的Filtering從不同的方向理解。

怎麼理解平均?

答:比如將高頻資訊抹去,影象邊界模糊,就好像整個影象模糊了,而模糊可以看作是一種平均操作。

怎麼理解卷積?

答:卷積實際上就是定義一個濾波器(濾波器也被稱之為卷積核),這個濾波器可以是一維陣列也可以是二維陣列,使用這個濾波器對原來的訊號挨個進行處理,然後把處理好的結果寫進一個與原資料相同大小的容器中。

濾波的本質是將訊號與濾波器在時域上進行卷積的操作。觀察下圖

首先訊號是一維訊號,而濾波器可以看作是視窗,可以左右滑動,視窗大小為3格,每格對應一個數。

而這就是為了進行卷積操作。

卷積操作

怎麼進行卷積操作?

答:在移動視窗的過程中,濾波器視窗上的那三個數對應訊號的三個數做一個點乘,將得出來的結果寫回視窗中心值對應的訊號位置。這樣就是卷積操作的過程,比如當前就是結果就是\(1\times (1/4)+3\times (1/2)+5\times (1/4)=3\)

當然,數學上卷積的定義不是這樣的,以上是圖形學裡簡化的卷積描述。

進一步舉例理解卷積定律:

上圖中上半部分表示,一張圖片進行使用3*3的一個卷積核進行卷積操作,得到的結果一張模糊的圖片,
同時如果對原始圖片進行傅立葉變換,把圖片從時域轉換到頻域,卷積核也經過傅立葉變換從時域轉換到頻域,這時把轉換到頻域的圖片與轉換到頻域的卷積核相乘,使用相乘的結果進行逆傅立葉變換得到的結果與在時域上進行卷積操作的結果一樣,這其實就是卷積定律的一部分內容:時域上的卷積相當於頻域上的乘積。

濾波器(卷積核)

為什麼卷積核要乘以1/9呢?

答:卷積核(濾波器)在使用的時候乘以1/9,它是一個3*3的二維陣列,之所以乘以1/9 是為了影象中整體的顏色值與原本的顏色不發生變化,在做卷積操作時會取原影象中的9個畫素與卷積核中的元素分別相乘再相加,如果不乘以1/9,得到的結果是原來的9倍,會導致影象異常明亮,乘以1/9其實是對處理結果進行了一個歸一化的操作

卷積核經過傅立葉變換後,可以發現它大都是低頻訊號,所以卷積核可以認為是一個低通濾波器。

通過上面的圖片發現,卷積核在時域上變大,它在頻域上反而變小了,也就是使用越大的卷積核經過卷積處理得到的影象會越模糊。

怎麼理解呢?

答:可以理解,當卷積核變大,比如用21x21的卷積核進行處理,最後得到的只能是更加模糊的影象。

Sampling=Repeating

使用a函式與c函式相乘,乘出來的結構就是e函式,其實就是取樣的訊號
卷積定律中的另一部分內容是:時域上的乘積相當於頻域上的卷積
依據上面的定律可以得到 a乘以c = e 等價於 b卷積d = f

通過上面的幾幅圖片可以發現,取樣結果在頻域上的體現就是把原本頻域的訊號進行重複,也可以認為取樣就是在重複原始訊號的頻譜。

Antialiasing

走樣的本質

我們已經知道取樣是根據衝擊函式的間隔(頻率)在重複訊號的頻譜,如下圖中下半部分,當衝擊函式的間隔(取樣頻率)小於頻譜的大小時,就會出現部分頻譜混疊的現象,這就是發生走樣現象的本質。

反走樣的方法

通常採用的反走樣的方法是,先對圖形進行模糊處理然後在進行取樣,之所以這樣可以達到反走樣的目的。

它實際的原理如下

如上圖,先對原始訊號做模糊處理,即使用低通濾波進行過濾,就可以拿掉頻譜上的高頻訊號,然後在使用原本的取樣(衝擊)函式進行取樣,會發現原本混疊的部分在取樣前被過濾掉了,這樣訊號最大限度的保持了原有的樣子,又保證不會發生混疊,進而達到反走樣的目的。

接下來列舉幾個重要的反走樣的方法:

多重取樣 MSAA

多重取樣 MSAA( Multi Sampling Anti-Aliasing)取更多的點來實現反走樣,把一個畫素繼續劃分成很多個小的畫素,同樣每個小的畫素也有各自的中心點,如下圖中把一個畫素分成四點小的畫素,然後對每個小的畫素判斷是否在三角形上,然後根據小畫素的在三角形中的個數得到這個畫素在三角形中的覆蓋率,通過覆蓋率可以算出這個畫素對應的顏色,MSAA實際上解決的是對圖形進行模糊操作的這個過程,他只是通過近似的一種方法進行模糊,只是增加了取樣點並沒有提高螢幕解析度。

快速近似抗鋸齒 FXAA

快速近似抗鋸齒 FXAA(Fast Approximate Anti-Aliasing),是一種和取樣無關,在影象層面做的處理。處理過程是對已經取樣的圖片處理,找到三角形的邊界,把有鋸齒的邊界替換為沒有鋸齒的邊界,而且處理起來非常快。

時間抗鋸齒 TAA

時間抗鋸齒 TAA(Temporal Anti-Aliasing),最大的特點就是非常快速,是將靜態的圖片在時間上進行取樣,用相鄰兩幀同一個畫素上不同位置的點來感知是否在三角形內,計算的時候要考慮上一幀感知的結果要被應用進來,相當於是MSAA對應的樣本分佈在時間上,並且當前這幀沒有任何額外的操作。

深度學習超級取樣 DLSS

深度學習超級取樣 DLSS (Deep Learning Super Sampling),它依賴深度學習,使用低解析度影象(比如1080p)生成高解析度影象(8K),再把8K影象縮回4K,得到抗鋸齒影象,以代替傳統的時間抗鋸齒等技術。