纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering
轉(zhuǎn)載自:http://www.cnblogs.com/cxrs/archive/2009/10/18/JustAProgramer.html
1、?為什么在紋理采樣時(shí)需要texture filter(紋理過(guò)濾)。
我們的紋理是要貼到三維圖形表面的,而三維圖形上的pixel中心和紋理上的texel中心并不一至(pixel不一定對(duì)應(yīng)texture上的采樣中心texel),大小也不一定一至。當(dāng)紋理大于三維圖形表面時(shí),導(dǎo)至一個(gè)像素被映射到許多紋理像素上;當(dāng)維理小于三維圖形表面時(shí),許多個(gè)象素都映射到同一紋理。
當(dāng)這些情況發(fā)生時(shí),貼圖就會(huì)變得模糊或發(fā)生錯(cuò)位,馬賽克。要解決此類問(wèn)題,必須通過(guò)技術(shù)平滑texel和pixel之間的對(duì)應(yīng)。這種技術(shù)就是紋理濾波。
不同的過(guò)濾模式,計(jì)算復(fù)雜度不一樣,會(huì)得到不同的效果。過(guò)濾模式由簡(jiǎn)單到復(fù)雜包括:Nearest Point Sampling(最近點(diǎn)采樣),Bilinear(雙線性過(guò)濾)、Trilinear(三線性過(guò)濾)、Anisotropic Filtering(各向異性過(guò)濾)。
在了解這些之前,有必要了解什么是MipMap和什么時(shí)各向同性,各向異性。
2、?什么是MipMap?
Mipmap由Lance Williams?在1983的一篇文章“Pyramidal parametrics”中提出。Wiki中有很詳細(xì)的介紹(http://en.wikipedia.org/wiki/Mipmap?) .?比如一張256X256的圖,在長(zhǎng)和寬方向每次減少一倍,生成:128X128,64X64,32X32,16X16,8X8,4X4,2X2,1X1,八張圖,組成MipMap,如下圖示。
?
Mipmap早已被硬件支持,硬件會(huì)自動(dòng)為創(chuàng)建的Texture生成mipmap的各級(jí)。在D3D的API:CreateTexture中有一個(gè)參數(shù)levels,就是用于指定生成mipmap到哪個(gè)級(jí)別,當(dāng)不指定時(shí)就一直生成到1X1。
3、?什么是各向同性和各向異性?
當(dāng)需要貼圖的三維表面平行于屏幕(viewport),則是各向同性的。當(dāng)要貼圖的三維表面與屏幕有一定角度的傾斜,則是各向異性的。
也可以這樣理解,當(dāng)一個(gè)texture貼到三維表面上從Camera看來(lái)沒(méi)有變形,投射到屏幕空間中后U方向和V方向比例仍然是一樣的,便可以理解成各向同性。反之則認(rèn)為是各向異性。
4、?Nearest Point Sampling(最近點(diǎn)采樣)
這個(gè)最簡(jiǎn)單,每個(gè)像素的紋理坐標(biāo),并不是剛好對(duì)應(yīng)Texture上的一個(gè)采樣點(diǎn)texel,怎么辦呢?最近點(diǎn)采樣取最接近的texel進(jìn)行采樣。
當(dāng)紋理的大小與貼圖的三維圖形的大小差不多時(shí),這種方法非常有效和快捷。如果大小不同,紋理就需要進(jìn)行放大或縮小,這樣,結(jié)果就會(huì)變得矮胖、變形或模糊。
5、?Bilinear(雙線性過(guò)濾)
雙線性過(guò)濾以pixel對(duì)應(yīng)的紋理坐標(biāo)為中心,采該紋理坐標(biāo)周圍4個(gè)texel的像素,再取平均,以平均值作為采樣值。
雙線性過(guò)濾像素之間的過(guò)渡更加平滑,但是它只作用于一個(gè)MipMap Level,它選取texel和pixel之間大小最接近的那一層MipMap進(jìn)行采樣。當(dāng)和pixel大小匹配的texel大小在兩層Mipmap level之間時(shí),雙線性過(guò)濾在有些情況效果就不太好。于是就有了三線性過(guò)濾。
6、?Trilinear(三線性過(guò)濾)
三線性過(guò)濾以雙線性過(guò)濾為基礎(chǔ)。會(huì)對(duì)pixel大小與texel大小最接近的兩層Mipmap level分別進(jìn)行雙線性過(guò)濾,然后再對(duì)兩層得到的結(jié)果進(jìn)生線性插值。
三線性過(guò)濾在一般情況下效果非常理想了。但是到目前為止,我們均是假設(shè)是texture投射到屏幕空間是各向同性的。但是當(dāng)各向異性的情況時(shí),效果仍然不理想,于是產(chǎn)生了Anisotropic Filtering(各向異性過(guò)濾)。
7、?Anisotropic Filtering(各向異性過(guò)濾)
先看效果,左邊的圖采用三線性過(guò)濾,右邊的圖采用各向異性過(guò)濾。
?
?
?
?
??? 各向同性的過(guò)濾在采樣的時(shí)候,是對(duì)正方形區(qū)域里行采樣。各向異性過(guò)濾把紋理與屏幕空間的角度這個(gè)因素考慮時(shí)去。簡(jiǎn)單地說(shuō),它會(huì)考濾一個(gè)pixel(x:y=1:1)對(duì)應(yīng)到紋理空間中在u和v方向上u和v的比例關(guān)系,當(dāng)u:v不是1:1時(shí),將會(huì)按比例在各方向上采樣不同數(shù)量的點(diǎn)來(lái)計(jì)算最終的結(jié)果(這時(shí)采樣就有可能是長(zhǎng)方形區(qū)域)。
我們一般指的Anisotropic Filtering(AF)均是基于三線過(guò)濾的Anisotropic Filtering,因此當(dāng)u:v不為1:1時(shí),則Anisotropic Filtering比Trilinear需要采樣更多的點(diǎn),具體要采多少,取決于是多少X的AF,現(xiàn)在的顯卡最多技持到16X AF。
當(dāng)開(kāi)啟16X AF的時(shí)候,硬件并不是對(duì)所有的texture采樣都用16X AF,而是需要先計(jì)算屏幕空間與紋理空間的夾角(量化后便是上面所說(shuō)的u:v),只有當(dāng)夾角大到需要16X時(shí),才會(huì)真正使用16X.
如果想了解AF的實(shí)現(xiàn)原理,可以查閱此篇Paper: “Implementing an anisotropic texture filter”.?現(xiàn)在AF都是硬件實(shí)現(xiàn),因此只有少數(shù)人才清楚AF就盡是怎樣實(shí)現(xiàn)了(其實(shí)細(xì)節(jié)我也沒(méi)搞清楚),其實(shí)完全可以由Pixel Shader來(lái)實(shí)現(xiàn)AF,當(dāng)然性能和由硬件做是沒(méi)得比的。
8、?各過(guò)濾模式性能比較。
?下表是各種過(guò)濾模式采一個(gè)pixel需要sample的次數(shù):
| ? | Sample Number |
| Nearest Point Sampling | 1 |
| Bilinear | 4 |
| Trilinear | 8 |
| Anisotropic Filtering?4X | 32 |
| Anisotropic Filtering?16X | 128 |
??
Anisotropic Filtering?16X效果最好,但是顯卡Performance會(huì)下降很多,當(dāng)然也是測(cè)試你手中顯卡Texture Unit的好方法。如果你覺(jué)得你的顯卡夠牛,那么就把AA和AF都打到最高再試試吧:)
?
轉(zhuǎn)載于:https://www.cnblogs.com/zengqh/archive/2012/12/30/2840009.html
總結(jié)
以上是生活随笔為你收集整理的纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 探讨PHP获取checkbox值
- 下一篇: JChartFree创建饼形图