應用程式不需要使用紋理篩選。 您可以設定 Direct3D,以計算紋素地址,該地址通常不會是整數,並複製擁有最接近整數地址的紋素色彩。 此過程稱為 最近點取樣。 最近點取樣可能用於當紋理的大小與螢幕上圖元的影像大小相似時。 如果沒有,則必須放大或縮小紋理。 紋理大小與基礎影像尺寸不匹配的結果可能是影像呈現出粗糙、鋸齒化或模糊的效果。
請謹慎使用最近點採樣,因為有時在材質單元之間的界限取樣紋理時可能會造成圖形瑕疵。 此界限是沿著紋理(u 或 v)的位置,取樣的紋素從一個紋素過渡到下一個紋素。 使用點取樣時,系統會選擇一個樣本紋素或另一個紋素,而且結果可能會在跨越界限時突然從一個紋素變更為下一個紋素。 此效果可能會在顯示的紋理中出現不希望的圖形雜訊。 使用線性篩選時,產生的紋素是由相鄰的紋素計算得出,並在紋理索引越過邊界時,順暢地在兩者之間過渡混合。
當將一個非常小的紋理映射到一個非常大的多邊形時,可以看到這種效果,此操作通常稱為放大。 例如,使用看起來像棋盤的紋理時,最接近的點取樣會產生顯示不同邊緣的較大棋盤。 相比之下,線性紋理濾波會產生影像,其中棋盤格顏色平滑變化地遍布於多邊形上。
在大部分情況下,應用程式應盡可能避免使用最近點採樣,以獲得最佳結果。 現今大部分的硬體都已針對線性篩選進行優化,因此您的應用程式不應降低效能。 如果您想要的效果絕對需要使用最鄰近點取樣,例如在使用紋理顯示可讀取的文字字元時,您的應用程式應該非常小心,避免在圖素邊界處進行取樣,這可能會導致不期望的效果。 下圖顯示這些成品的外觀。
群組右上方的兩個方塊看起來與周圍的方塊不同,因為有對角線的偏移貫穿其中。 若要避免這類圖形成品,您必須熟悉 Direct3D 紋理取樣規則,以便進行最近的點篩選。 Direct3D 會將浮點紋理座標從 [0.0, 1.0] (0.0 到 1.0,包含) 對應到介於 [ - 0.5, n - 0.5] 的整數紋素空間值,其中 n 是紋理上指定維度中的紋素數目。 紋理索引的結果會被四捨五入至最接近的整數。 此對應可能在紋素邊界引入取樣不準確性。
假設有一個應用程式使用環繞紋理尋址模式來渲染多邊形,這是一個簡單的範例。 使用 Direct3D 的對應方法時,u 紋理索引會像下圖所示對應於寬度為 4 紋素的紋理。
紋理座標的 
此圖的紋理座標 0.0 和 1.0 在這個例子中剛好位於紋素邊界上。 使用 Direct3D 映射值的方法,紋理座標範圍從 [-0.5, 4 - 0.5],其中 4 是紋理的寬度。 在此情況下,當紋理索引為 1.0 時,取樣的紋素是第 0 紋素。 不過,如果紋理座標略小於 1.0,取樣的紋素會是 n 紋素,而不是 0 紋素。
這的含意在於,使用剛好0.0和1.0的紋理座標放大小型紋理,並在螢幕空間對齊的三角形上進行最接近點篩選,會產生紋理地圖在紋素之間的界限取樣的圖元。 在紋理座標計算中,即使是很微小的誤差,也會在渲染圖像中對應到紋理貼圖的紋素邊緣的地方產生偽影。
執行將浮點紋理座標精確地映射到整數紋素上是困難且計算耗時的,並且通常沒有必要。 大部分的硬體實作都會使用反覆方法,計算三角形內每個圖元位置的紋理座標。 迭代方法通常會隱藏這些錯誤,因為錯誤在迭代過程中會均勻累積。
Direct3D 參考光柵化器會使用直接評估方法來計算每個像素位置的紋理索引。 直接評估與反覆方法不同,因為作業中的任何錯誤都表現出更隨機的錯誤分佈。 因此,在邊界發生的取樣錯誤可能更加明顯,因為參考光柵化器無法以完美的精確度執行此操作。
最佳方法是只在必要時使用最接近點篩選。 當您必須使用它時,建議您將紋理座標從界限位置略微偏移,以避免瑕疵。
相關主題