纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering
轉載自:http://www.cnblogs.com/cxrs/archive/2009/10/18/JustAProgramer.html
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的次數:
| ? | 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都打到最高再試試吧:)
?
轉載于:https://www.cnblogs.com/zengqh/archive/2012/12/30/2840009.html
總結
以上是生活随笔為你收集整理的纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探讨PHP获取checkbox值
- 下一篇: JChartFree创建饼形图