在介紹紋理過濾方式前,先說下紋理。
紋理
紋理就是一塊二位的圖形,用來表示物體的表面圖案,一般稱為紋理貼圖。紋理映射就是將紋理空間的中紋理像素映射到屏幕空間中的像素的過程。OpenGL中紋理的各種過濾和設(shè)置,就是為了控制紋理映射的結(jié)果。
紋理映射從兩種類型考慮,一種是在光滑平面上添加紋理,添加之后表面保持形狀不變,這種過程基本上,用一個映射函數(shù)描述即可完成;另一種是表面呈現(xiàn)出凹凸不平的形狀,這種過程用擾動函數(shù)描述。第一種比較常見些,下面就說下光滑表面剩的紋理映射。
這種相當(dāng)于從一個坐標(biāo)系到另一個坐標(biāo)系的變換,如,在紋理空間的正標(biāo)坐標(biāo)系(u,v)中定義一個紋理圖案,要貼的表面的正交坐標(biāo)系表示位(s,t)。通過一個映射函數(shù)進(jìn)行變換:
s=f(u,w)
t=g(u,w)
或者反向變換
s=f(u,w)
t=g(u,w)
來表示,這里的映射函數(shù)決定了紋理的效果,最簡單的映射函數(shù)可以是一個線性函數(shù):
s=Au+B, t=Cw+D
其中A、B、C、D可以通過兩個坐標(biāo)系中已知點(diǎn)求得。
紋理過濾方式
紋理過濾就是給被貼表面上每個像素著色的過程。因為紋理照片和被貼表面的大小不同,兩者之間的像素不能一比一的對應(yīng),所以引入了不同的紋理過濾方式,不同的過濾方式所呈現(xiàn)出來的貼圖效果不同,有的小紋理照片在被映射到大的貼圖表面時會出現(xiàn)類似馬賽克或模糊的效果。
常見的紋理過濾方式分為兩類:線性紋理過濾和各向異性紋理過濾。線性紋理過濾又分成雙線性和三線性紋理過濾。
雙線性紋理過濾
雙線性紋理在進(jìn)行縮放顯示時,將一個像素分成2*2的紋理元素區(qū)域快,這個樣就擁有四個紋理元素區(qū)域了,然后以目標(biāo)紋理的像素點(diǎn)位中心,對該店附近的4個像素顏色值求平均值,再將這個平局顏色值貼到目標(biāo)圖像素的位置上。
優(yōu)點(diǎn):運(yùn)算量小,比較適合于有一定景深的靜態(tài)影響
缺點(diǎn):經(jīng)過雙線性處理后的像素顯得有些模糊,不適合非常小的三維物體,不適合移動中的物體,會產(chǎn)生條紋紋理變形等問題,當(dāng)視角發(fā)生變化時,可能有視覺閃爍感。
三線性紋理過濾
三線性紋理過濾以雙線性過濾為基礎(chǔ),原理與雙線性紋理過濾一樣,只不過三線性紋理過濾的采樣范圍更大。三線性紋理過濾主要在雙線性紋理過濾的基礎(chǔ)上增加了4個紋理元素作為采樣的參考,使用兩次雙線性紋理過濾,計算8個像素的值。
一般情況下,三線性過濾的效果非常理想,可以比雙線性過濾更加有效地解決不同等級紋理過濾時出現(xiàn)的組合、交叉以及重疊現(xiàn)象。但是當(dāng)物體消失的方向(透視方向)和我們的視角有一定夾角時,三線性過濾任然存在失真。
各向異性紋理過濾
各向異性紋理過濾主要通過增加更多貼圖模型,消除z軸旋轉(zhuǎn)表面的鋸齒狀線條而達(dá)到更好的畫面效果,融合了雙線性紋理過濾和三線性紋理過濾的一些特點(diǎn)。各向異性紋理過濾不同于雙線性和三線性過濾,后兩者都是各向同性的過濾,在各個放行上矢量值都是一致的,在渲染時各個圖元像素的尺寸、形狀都是固定的;各向異性過濾正好相反,主要處理適量方向值不一致的數(shù)據(jù),在渲染時使用尺寸可變的圖元像素。