1. 程式人生 > >紋理基礎知識和過濾模式詳解

紋理基礎知識和過濾模式詳解

1、 為什麼在紋理取樣時需要texture filter(紋理過濾)。

我們的紋理是要貼到三維圖形表面的,而三維圖形上的pixel中心和紋理上的texel中心並不一至(pixel不一定對應texture上的取樣中心texel),大小也不一定一至。當紋理大於三維圖形表面時,導至一個畫素被對映到許多紋理畫素上;當維理小於三維圖形表面時,許多個畫素都對映到同一紋理。

當這些情況發生時,貼圖就會變得模糊或發生錯位。要解決此類問題,必須通過技術平滑texel和pixel之間的對應。這種技術就是紋理濾波。

不同的過濾模式,計算複雜度不一樣,會得到不同的效果。過濾模式由簡單到複雜包括:Nearest Point Sampling(最近點取樣),Bilinear(雙線性過濾)、Trilinear(三線性過濾)、Anisotropic Filtering(各向異性過濾)。

在瞭解這些之前,有必要了解什麼是多級紋理貼圖(MipMap)和什麼是各向同性,各向異性。

2、 什麼是MipMap?

Mipmap由Lance Williams 在1983的一篇文章“Pyramidal parametrics”中提出。Wiki中有很詳細的介紹(http://en.wikipedia.org/wiki/Mipmap ) . 比如一張256X256的圖,在長和寬方向每次減少一倍,生成:128X128,64X64,32X32,16X16,8X8,4X4,2X2,1X1,八張圖,組成MipMap,如下圖示。

Mipmap早已被硬體支援,硬體會自動為建立的Texture生成mipmap的各級。在D3D的API:CreateTexture中有一個引數levels,就是用於指定生成mipmap到哪個級別,當不指定時就一直生成到1X1。

3、 什麼是各向同性和各向異性?

當需要貼圖的三維表面平行於螢幕(viewport),則是各向同性的。當要貼圖的三維表面與螢幕有一定角度的傾斜,則是各向異性的。

也可以這樣理解,當一個texture貼到三維表面上從Camera看來沒有變形,投射到螢幕空間中後U方向和V方向比例仍然是一樣的,便可以理解成各向同性。反之則認為是各向異性。

4、 Nearest Point Sampling(最近點取樣)

這個最簡單,每個畫素的紋理座標,並不是剛好對應Texture上的一個取樣點texel,怎麼辦呢?最近點取樣取最接近的texel進行取樣。

當紋理的大小與貼圖的三維圖形的大小差不多時,這種方法非常有效和快捷。如果大小不同,紋理就需要進行放大或縮小,這樣,結果就會變得矮胖、變形或模糊。

5、 Bilinear(雙線性過濾)

雙線性過濾以pixel對應的紋理座標為中心,採該紋理座標周圍4個texel的畫素,再取平均,以平均值作為取樣值。

雙線性過濾畫素之間的過渡更加平滑,但是它只作用於一個MipMap Level,它選取texel和pixel之間大小最接近的那一層MipMap進行取樣。當和pixel大小匹配的texel大小在兩層Mipmap level之間時,雙線性過濾在有些情況效果就不太好。於是就有了三線性過濾。

6、 Trilinear(三線性過濾)

三線性過濾以雙線性過濾為基礎。會對pixel大小與texel大小最接近的兩層Mipmap level分別進行雙線性過濾,然後再對兩層得到的結果進生線性插值。

三線性過濾在一般情況下效果非常理想了。但是到目前為止,我們均是假設是texture投射到螢幕空間是各向同性的。但是當各向異性的情況時,效果仍然不理想,於是產生了Anisotropic Filtering(各向異性過濾)。

7、 Anisotropic Filtering(各向異性過濾)

先看效果,左邊的圖採用三線性過濾,右邊的圖採用各向異性過濾。

各向同性的過濾在取樣的時候,是對正方形區域裡行取樣。各向異性過濾把紋理與螢幕空間的角度這個因素考慮時去。簡單地說,它會考濾一個pixel(x:y=1:1)對應到紋理空間中在u和v方向上u和v的比例關係,當u:v不是1:1時,將會按比例在各方向上取樣不同數量的點來計算最終的結果(這時取樣就有可能是長方形區域)。

我們一般指的Anisotropic Filtering(AF)均是基於三線過濾的Anisotropic Filtering,因此當u:v不為1:1時,則Anisotropic Filtering比Trilinear需要取樣更多的點,具體要採多少,取決於是多少X的AF,現在的顯示卡最多技持到16X AF。

當開啟16X AF的時候,硬體並不是對所有的texture取樣都用16X AF,而是需要先計算螢幕空間與紋理空間的夾角(量化後便是上面所說的u:v),只有當夾角大到需要16X時,才會真正使用16X.

如果想了解AF的實現原理,可以查閱此篇Paper: “Implementing an anisotropic texture filter”. 現在AF都是硬體實現,因此只有少數人才清楚AF的具體實現,也可以由Pixel Shader來實現AF,當然效能遠不如使用硬體來完成。

8、 各過濾模式效能比較。

下表是各種過濾模式採一個pixel需要sample的次數:

型別 取樣數
Nearest Point Sampling 1
Bilinear 4
Trilinear 8
Anisotropic Filtering 4X 32
Anisotropic Filtering 16X 128

一般而言,取樣數越多,效果最好,但具體使用時要綜合考慮效能。