紋理過濾模式中的Bilinear、Trilinear以及Anistropic Filtering
我們的紋理是要貼到三維圖形表面的,而三維圖形上的pixel中心和紋理上的texel中心並不一至(pixel不一定對應texture上的取樣中心texel),大小也不一定一至。當紋理大於三維圖形表面時,導至一個畫素被對映到許多紋理畫素上;當維理小於三維圖形表面時,許多個象素都對映到同一紋理。
當這些情況發生時,貼圖就會變得模糊或發生錯位,馬賽克。要解決此類問題,必須通過技術平滑texel和pixel之間的對應。這種技術就是紋理濾波。
不同的過濾模式,計算複雜度不一樣,會得到不同的效果。過濾模式由簡單到複雜包括:Nearest Point Sampling(最近點取樣),Bilinear(雙線性過濾)、
在瞭解這些之前,有必要了解什麼是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的次數:
Sample Number |
|
Nearest Point Sampling |
1 |
Bilinear |
4 |
Trilinear |
8 |
Anisotropic Filtering 4X |
32 |
Anisotropic Filtering 16X |
128 |
Anisotropic Filtering 16X效果最好,但是顯示卡Performance會下降很多,當然也是測試你手中顯示卡Texture Unit的好方法。如果你覺得你的顯示卡夠牛,那麼就把AA和AF都打到最高再試試吧:)