材質過濾
在電腦圖學中,材質過濾(Texture filtering)是一種針對一個使用材質貼圖的像素,使用臨近的一個或多個紋素計算其紋理顏色的方法。從數學上來說,材質過濾是抗鋸齒的一種,但它更着重於濾掉材質中的高頻,而不像其他抗鋸齒技術那樣着重於改善邊界顯示效果。簡單來說,它使得同一個材質可以被用於不同的形狀,尺寸和角度,同時儘可能減少顯示時的模糊和閃爍。
用戶可以權衡計算複雜度和圖像質素,在許多種材質過濾方法中進行選擇。
為何需要材質過濾
[編輯]在應用材質貼圖時,需要對於每一個像素中心所在的位置進行查詢材質值的操作。但是由於被彩現的目標表面相對於視角,可能處於任意距離或者角度,一個像素不一定有一個紋素對應。所以需要應用某種過濾方式來決定其材質值,缺少過濾或使用不當都會造成最終的圖像存在例如鋸齒和閃爍之類的瑕疵。
由於應用材質貼圖的表面相對於視角的距離和角度不同,在表面之上的一個像素和對應的材質之上一個或多個紋素之間可能存在多種對應關係,這也導致需要應用不同的過濾方式。如果把一個正方形的材質對映到一個正方形的表面上,在離視角的某一個距離上,螢幕上的一個像素和一個紋素幾乎等尺寸。如果比這個距離近,紋素就會比像素尺寸大,這是就需要將紋素相應地放大,這就是所謂的材質放大。同理,如果比這個距離遠,紋素將比像素尺寸小,一個像素最終的材質值就會從其覆蓋的多個紋素的值計算出,這也就是通常所說的材質縮小。常見的圖像應用程式介面,例如OpenGL,提供了多種的縮小和放大過濾方式。
值得注意的是,即使在像素和紋素尺寸相等的情況下,其之間也不一定就存在一一對應的關係。例如可能存在錯位而導致一個像素覆蓋了相鄰四個紋素的各一部分。所以仍然需要某種過濾方式。
Mipmapping
[編輯]Mipmapping是一種常見的通過預計算減小彩現時所需過濾工作的方法。在材質放大中,所參與計算一個像素的材質值的紋素一般是四個或更少;而在材質縮小中,隨着目標表面遠離視點,整個材質尺寸可能最終將比一個像素還小,這將造成需要其上的所有紋素進行計算,這樣造成的計算量和頻寬在即時彩現中是不現實的。Mipmapping通過進行預計算,並將結果儲存在一系列更小尺寸的材質中,避免了這種情況的發生。當目標表面逐漸遠離時,更小尺寸的材質將自動被選用參與計算。
過濾方式
[編輯]以下列舉了常見的材質過濾方式,以計算成本從少到多排序。
最近鄰插值
[編輯]最近鄰插值是最快速,也是最粗糙的過濾方式。最鄰近像素中心的紋素顏色將被作為像素的顏色。在材質放大時,這種方式會導致色塊;而在材質縮小時,則會導致閃爍和鋸齒。
最近鄰Mipmapping
[編輯]這種方式先根據距離選擇最近的mipmap層級,再從其中選擇最靠近像素中心的紋素。這對閃爍和鋸齒很有效,但不能減少色塊。
雙線性過濾
[編輯]雙線性過濾會從最近的mipmap層次上,選擇最靠近像素中心的四個紋素,再根據他們靠近像素中心的具體進行權重插值。這時如果進行材質放大,當像素相對於紋素移動時,像素顏色會從逐漸從一個紋素顏色變化到相鄰的紋素顏色,而不是像最近鄰插值那樣,在穿過兩個紋素的邊界時發生突變,這樣就消除色塊。雙線性過濾經常與mipmapping一起使用,但也可以單獨使用,但這時會出現閃爍和鋸齒化的問題。
三線性過濾
[編輯]在使用mipmapping雙線性過濾時,當目標表面的距離變化時,會從一個mipmap層次突變到相鄰的層次。三線性過濾被用來解決這個問題,方法是在最相鄰的兩個mipmap層次上分別進行雙線性過濾,再用得到的兩個值進行線性插值。值得注意的是,當距離小於mipmap的零層次時(即紋素大小超過像素大小時),三線性插值退化為雙線性插值。
各向異性過濾
[編輯]各向異性過濾是現有消費級顯示卡所提供的圖像質素最佳的過濾方式。傳統的各項同性過濾中只是在正方形的mipmap層次間進行雙線性或三線性插值,但是當一個目標表面和攝像放像機之間角度較大時,材質的填充面積並不是正方形,這樣便引入了模糊和閃爍等瑕疵。 於是,各向異性過濾需要對一個非方形材質進行採樣。在一些簡單的實現中,顯示卡使用長方形的材質取代方形材質,達到了較好的近似效果。但是這種方式在處理邊界時效果依然不理想,原因是在傾斜的表面上,近端邊界比遠端邊界擁有更多的像素。於是一些高端顯示卡使用了梯形材質,當然這也要求更大的運算量。