GAMES101-現代計算機圖形學入門-閆令琪 - lecture6 光柵化2(抗鋸齒) - 課後筆記

光柵化2(抗鋸齒)(Rasterization 2 - Antialiasing)

抗鋸齒的內容包括:

  • 採樣理論(Sampling theory)
  • 抗鋸齒的實踐應用(Antialiasing in practice)

接着上節

我們採樣是在每個像素的中心進行採樣,然後判斷這個像素中心是否在三角形內,如果是三角形內就對其進行上色

在這裏插入圖片描述

最終得到的效果就是由多個像素均勻的正方形像素所組成的三角形:

在這裏插入圖片描述

emmmm,和我們想要的三角形不太一樣,多了許多的棱角,不夠平滑
在這裏插入圖片描述

在這個棱角很多的三角形中發生了一些採樣錯誤,我們稱其爲鋸齒

在這裏插入圖片描述

鋸齒在平常很常見,比如對一張圖片放大,就可以明顯看到鋸齒,或者在遊戲中,如果關閉了抗鋸齒的選項,也能夠看到很明顯的鋸齒

在這裏插入圖片描述

鋸齒到底怎麼來的,需要先從採樣的理論開始說:

採樣在圖形學中廣泛存在

在這裏插入圖片描述

光柵化 = 在2D的位置上進行採樣

在這裏插入圖片描述

圖片 = 對圖像傳感器進行採樣

在這裏插入圖片描述

視頻 = 在時間上進行採樣

什麼是視頻呢,視頻時將一系列圖片連續的放出來從而達到一個連續的動畫效果。人眼在觀看視頻時,就是對其中不同的時間上的圖像進行採樣,將這些採樣的圖像連接起來,最終得到一個動畫的效果。比如一般動畫片都是每秒24幀,就是說一秒內播放24張圖片,然後人眼對這24張圖片進行採樣,得到動畫的效果。每秒播放的圖片越多,動畫越流暢。

在這裏插入圖片描述

圖形學中的採樣錯誤(Sampling Artifacts in Computer Graphics)

採樣錯誤有多種,如鋸齒就是其中之一。
在這裏插入圖片描述

圖像中的莫爾紋(Moiré Patterns in Imaging),也是一種採樣錯誤。如下圖所示,左邊是原圖,右邊在採樣時跳過了圖像中的奇數行和列。
在這裏插入圖片描述

還有一種車輪效應,比如我們在看高速運轉的車輪時,會發現車輪有時順時針旋轉,有時逆時針旋轉,這也是一種採樣錯誤

究竟爲什麼會出現採樣錯誤?

信號變化的速度太快(主要指高頻信號變化太快),而採樣的速度太慢,最終結果就是會導致採樣錯誤。

抗走樣的主要思想:在採樣之前進行模糊處理(Antialiasing idea:bluring before sampling)

如果不對其進行模糊處理,直接採樣,就會出現下圖的效果:

在這裏插入圖片描述

這樣進行採樣,就會發現:鋸齒狀的三角形像素值總爲純紅或者純白。單純的兩種顏色在邊緣發生突變,就會導只鋸齒十分的明顯。

如果先對其進行模糊處理,然後再採樣呢?
在這裏插入圖片描述

可以看到採樣點增加了,並且在邊緣處有一些顏色比較淡的點。也就是在光柵化的過程中,三角形的抗鋸齒邊緣的像素取了一個介於紅色和白色之間的像素值,再進行染色時,邊緣的像素點就會染色爲中間值,邊緣就能夠獲得一些更加平滑的效果,起到抗鋸齒的作用。如下圖所示:

在這裏插入圖片描述

下面左圖爲直接採樣,右圖爲先模糊後採樣的效果:
在這裏插入圖片描述

那麼問題來了,如果先採樣後模糊,會得到什麼效果呢?

在這裏插入圖片描述

如左圖所示,並不能實現抗鋸齒的效果。那麼問題就來了:

  • 爲什麼採樣不足會導致鋸齒?
  • 爲什麼先模糊後採樣能夠抗鋸齒,而先採樣後模糊不行?

要解釋上面的願意就要引入頻域了

頻域(Frequency Domain)

首先從最簡單的正弦波和餘弦波開始看:

在這裏插入圖片描述

用正弦和餘弦有什麼好處呢?

在這裏插入圖片描述
如果把正弦和餘弦的係數f考慮進去,就可以得到頻率不同的正弦波和餘弦波,其中f就是頻率。

傅里葉變換(Fourier Transform)

傅里葉變換就是說,一個函數f(x),能夠分解成許多不同的正弦波或者餘弦波的和。
在這裏插入圖片描述

具體反應到函數圖像上就是:
在這裏插入圖片描述

從第一個函數圖像看,只有一個餘弦波,將這個波加上一個數,讓其整體向上位移,但是與目標函數f(x)相差很遠

往下面看就可以發現,越來越多不同頻率的餘弦波疊加,最後就能夠得到一個近似f(x)的函數圖像。

**傅里葉變換的作用:**將信號從時域轉換到頻域。(時域並不是說就一定是時間的信息。圖像並不帶任何時間的信息,但我們認爲空間上的信息也算是時域,時域只是一個單純的名字。這裏指把圖像從圖像的空間變換到頻率的空間)
在這裏插入圖片描述

其逆變換能夠從頻域變換回時域。

之前曾經提到,因爲採樣速度跟不上信號變化的頻率,所以導致採樣出錯。下面這個圖就能解釋:
在這裏插入圖片描述

垂直的虛線爲採樣點,綠色爲函數圖像,從上到下頻率依次增高,黑點爲在函數上採樣的點,藍色的虛線是將採樣的點鏈接一起。

f1(x)中,採樣的點的線連起來比較接近原來的圖像,而下面隨着頻率的升高,連起來的藍色的虛線無法再還原成原來的函數圖像。所以就會導致採樣出錯。

要解決採樣的錯誤,解決辦法就是在採樣之前進行模糊,既然說到模糊了,就不得不說一下濾波

濾波器 = 拋棄特定頻率的內容(Filtering = Getting rid of certain frequency contents)

先看一個將圖像轉換到頻域的例子:
在這裏插入圖片描述

左圖爲原圖,右圖爲經過傅里葉變換得到圖像的頻譜,其中中間最亮的部分爲低頻率範圍,而邊上黑色的部分爲高頻率範圍。

先看一下高通濾波器的效果:

在這裏插入圖片描述

高通濾波器消除了圖像中的低頻信息,然後在對頻譜進行逆變換得到原圖,最終得到的圖像只有邊緣的信息,爲什麼?因爲某一點是邊界點的話,那麼該點的上下、或者左右的變化就會非常大,所以該點的信號變化就會非常大。所以高頻信息代表着圖像的邊緣。

再看一下低通濾波器的效果:

在這裏插入圖片描述

低通濾波器消除了圖像中的高頻信息,最後得到的頻譜逆變換爲原圖後,發現原圖已經是一個模糊的效果。因爲高頻信息代表着圖像的邊界以及一些更爲細節的信息,如果抹去高頻信息,那麼圖像的細節就會消除,最後得到的就是模糊的圖像。

中通濾波器:

在這裏插入圖片描述
在這裏插入圖片描述

兩個爲不同的中通濾波器的效果,下面的圖通過的高頻信息更多,圖像的邊界就更清楚一些,而上圖通過的低頻信息多,圖像就更模糊一些。

濾波器 = 卷積 = 平均 (Filtering = Convolution = Averaging)

卷積的運算方法不做過多贅述,下面大概瞭解一下卷積定理:兩個信號在時域上的卷積結果,就等價於,將兩個信號轉換到對應的頻域,然後再用兩個頻譜相乘得到的結果。

卷積的運算方式:

  • 直接用卷積核在時域上進行卷積運算
    • 先將圖像通過傅里葉變換轉換到頻域
    • 在將卷積核通過傅里葉變換轉換到頻域,並且將兩個頻譜相乘
    • 將最後得到的結果通過逆傅里葉變換轉換到時域
      在這裏插入圖片描述

上圖就表示了卷積運算的兩種方式。看一下在頻域的變換,卷積核變換到頻域後只保留了低頻信息,然後將兩個頻譜相乘,最後得到的也只有低頻信息,再對其進行逆傅里葉變換,最終就得到了一個模糊的圖像。(低頻信息圖像時模糊圖像,前面提到過)

卷積核 / 濾波器(Convolution Kernel / Box Filter)

在這裏插入圖片描述

這個卷積核就是求圖像上某一點周圍像素的平均值,然後將最後得到的結果作爲中心點的像素。 前面的係數 1/9 是一個很特殊的數,把1/9乘到卷積核裏,最後得到的卷積核內部九個數的和爲1。如果不×1/9,那麼周圍的所有像素相加就會越加越亮,最後可能會導致全白的結果。也就是說,如果卷積核的和 = 1,就能夠保持和原來圖像相同的亮度,大於1圖像就會變亮,小於1圖像邊暗。
在這裏插入圖片描述

一個濾波器有一定的大小,如上左圖爲一個濾波器在時域中的大小,右圖爲濾波器反應到頻域中的狀態。那麼應該思考,如果濾波器在時域上的大小變大或者變小,頻域會發生什麼變化?

舉個例子,使用3*3的濾波器能夠達到一個使圖像模糊的效果,如果用5 * 5, 7 * 7 ,甚至更大的濾波器,會得到什麼效果呢?隨着濾波器大小的增大,圖像會變得越來越模糊,因爲取平均值的範圍越大,那麼這個範圍內的像素的區別就會越小,圖像也就會越模糊;與之相反,如果用一個1 *1 的濾波器呢?那就相當於沒有進行濾波,圖像也就不會變模糊。

綜合上面的信息,可以得到,濾波器越大,其圖像越模糊,那麼就說明能夠通過的頻率就越低,頻譜上對應的頻率的範圍也就會變小。
在這裏插入圖片描述

上圖就是濾波器變大,而對應的頻率變得更低。

採樣 = 重複 頻率的內容 (Sampling = Repeating Frequency Contents)

在這裏插入圖片描述

上圖a是一個連續函數的圖像,b是a對應的頻域的圖像。我們要對函數a進行採樣,如何進行採樣呢?採樣就是對函數進行離散化的過程,只保留函數上某些特定位置的函數值,其餘不要。這就相當於 一個函數× 另一個函數。 反應到上圖就是 a × c (c是衝激函數), 得到的結果e就是對a採樣的結果,可以看到這個採樣能夠還原函數a的圖像。

我們說,時域上的乘積 = 頻域上的卷積,也就是說我在時域上對 a×c的操作,在頻域上要把b和d進行卷積。b卷積d的結果就是f,就可以發現在時域上對一個連續函數進行採樣,而在頻域上,則是對該連續函數的頻譜進行了一個複製粘貼的操作。所以說採樣是什麼,採樣就是重複一個原始信號的頻譜。也就是說在時域上進行採樣 等價於 在頻域上進行週期延拓。

在有了這樣的理解之後,就可以探討爲什麼會產生走樣的現象

走樣 = 頻率內容混合 (Aliasing = Mixed Frequency Contents)

在這裏插入圖片描述

上面兩幅圖反映了不同採樣頻率下,最後得到的頻域的頻譜圖。

採樣不同的間隔,會影響頻譜會以另外一種間隔移動。在第一行中,進行密集的採樣時,頻譜的移動範圍間隔較大,能夠保證各個頻段分隔不會相互影響。而在下面的第二行中,當採樣的頻率不夠時,頻譜的移動範圍就會變小,最終導致頻譜混疊,這種情況下就發生了走樣。

爲什麼時域和頻域的間隔是互爲反比的關係呢?我們上面已經講到,採樣相當於連續函數乘一個衝激函數,而衝激函數的間隔就是在時域上採樣的間隔,因爲衝激函數在頻域裏的間隔是時域裏的倒數,所以時域越寬,頻域越窄。

既然已經瞭解到爲何會出現走樣,那麼接下來就應該來看一下,如何抗走樣。

反走樣(Antiliasing)

如何減少走樣?

Option 1 : 提高採樣率

  • 提高顯示器分辨率。如果用一個640*480的顯示器,光柵化一個三角形,就能夠明顯發現鋸齒很嚴重,但是如果使用1920 * 1080的顯示器就能夠明顯改善這種情況
  • 但是這種情況需要依賴於高分辨率的顯示器,若是顯示器分辨率不能改變時,這種方法就不行了

Option2 : 反走樣

  • 先把一個信號的高頻信息抹除
  • 然後再採樣
    在這裏插入圖片描述

如上圖,在採樣之前,先用濾波器(虛線框)抹除掉高頻率的信息,然後再對圖像進行採樣。可以看到,如果不用濾波器進行濾波,那麼就會像之前一樣,在高頻段的部分會導致頻譜的疊加,然後發生走樣。用濾波器進行濾波之後,就不會在發生頻譜的疊加,也就減少了走樣。

上面就是先用模糊再採樣能夠反走樣的原理。

然後再回到我們的做法當中,先模糊 再採樣 = 抗走樣
在這裏插入圖片描述

在實際中,用什麼樣的濾波器進行一個模糊的操作?使用一個一定大小的低通濾波器對三角形進行卷積,就可以得到模糊的效果。

計算平均像素值實現抗走樣(Antialiasing by Computing Average Pixel Value)

對於任何一個像素,被三角形覆蓋的情況只有三種:1.完全被覆蓋 2. 完全不被覆蓋 3.部分被覆蓋

在這裏插入圖片描述

對於任何一個被覆蓋的像素,我們要計算這個像素的平均值就是看被覆蓋的面積佔整個像素多少比例,比如圖1,三角形覆蓋了1/8,未覆蓋7/8,那麼這個點的平均像素就是 1/8的黑色+7/8的白色作爲最終的像素值。就是說把像素內部的值給平均一下,這就是所作的卷積操作。

MSAA(Antialiasing By Supersampling)

我將其翻譯爲通過多重採樣反走樣。

因爲按照上面的那種求每個像素中的區域百分比十分困難,所以就有了MSAA這種反走樣的方法,其思想也是如上面的那種方法,但是取的是一個近似的求區域像素平均值的方法。

什麼是多重採樣?

在之前採樣時,都是對一個像素的像素中心進行一次採樣。那麼超採樣就是對一個像素進行多次採樣,如下圖所示:
在這裏插入圖片描述

將一個像素劃分爲 4*4個小像素,每一個小像素都有一個像素中心,然後可以對這個小像素進行採樣,判斷這些小像素在不在三角形內,然後將最後的結果平均起來,就能夠求的三角形對一個像素的區域的近似的覆蓋。比如:
在這裏插入圖片描述

可以看到一個三角形覆蓋了若干個像素,每個像素都挺大的。

假如說我把一個像素分爲四個小像素,在像素內部多加一些採樣點
在這裏插入圖片描述

然後每個點都可以判斷是否在三角形內,如果四個點都在三角形內就是100%覆蓋,如果只有三個點在三角形內,則三角形對這個像素就是75%覆蓋。於是就可以得出每個像素的覆蓋結果

在這裏插入圖片描述

通過這麼一種方法,可以做到一個抗鋸齒的效果。

有一點要注意:MSAA通過更多的樣本,來近似的進行反走樣的第一步,模糊,這個過程。模糊完了之後就相當於每一個像素內部都已經知道了三角形的覆蓋率,求了平均之後是什麼,就會得到上圖的結果。到了這一步,就相當於模糊做完了,就相當於用卷積覈對圖像進行了一次卷積得到了模糊的效果。然後再採樣,這時採樣就會十分簡單,以爲每個格子的顏色都是平均的,採樣完也就會得到上圖的結果。

MSAA解決的是對信號進行模糊的操作,而採樣的這一部操作實際上是隱含在了模糊的過程中。

MSAA的過程:

  • 將每個像素劃分爲多個小像素
  • 判斷每個小像素的中心是否在三角形內部,從而得到三角形在該像素的覆蓋率
  • 得到覆蓋率之後對這個像素的像素值進行平均,得到上圖的結果
  • 然後採樣

MSAA並不是通過提高採樣率而完成的,對更多的點進行採樣只是爲了得到三角形在一個像素上的覆蓋比率而已。

MSAA的缺陷

MSAA提高了計算的量,將一個像素劃分爲多個區域,就要對每個區域進行多次計算,最後就提高了計算的成本。

其他反走樣方式

  • FXAA (Fast Approximate AA)
  • TAA (Temporal AA)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章