紋理基礎(chǔ)知識(shí)和過(guò)濾模式詳解(轉(zhuǎn))

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ò)濾)。

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

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),也可以由Pixel Shader來(lái)實(shí)現(xiàn)AF,當(dāng)然性能遠(yuǎn)不如使用硬件來(lái)完成。

8、 各過(guò)濾模式性能比較。

下表是各種過(guò)濾模式采一個(gè)pixel需要sample的次數(shù):

類型采樣數(shù)

Nearest?Point?Sampling1

Bilinear4

Trilinear8

Anisotropic?Filtering?4X32

Anisotropic?Filtering?16X128

一般而言,采樣數(shù)越多,效果最好,但具體使用時(shí)要綜合考慮性能。

轉(zhuǎn)自:http://m.blog.csdn.net/puppet_master/article/details/53485919

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容