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

原文地址:紋理基礎知識和過濾模式詳解


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

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


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