最接近點取樣

應用程式不一定需要使用紋理篩選。 Direct3D 可進行設定,以計算紋理像素位址 (通常不會評估為整數),並使用最接近整數的位址來複製紋理像素的色彩。 這個程序就是所謂的最接近點取樣。 最接近點取樣就好像紋理大小小於畫面上的原始物件影像大小一樣。 若非如此,紋理就需放大或縮小。 如果紋理大小與原始物件影像大小不符,就有可能產生塊狀、鋸齒狀或模糊的影像。

請謹慎使用最接近點取樣,因為當紋理的取樣位置介於兩個紋理像素之間的界限時,它有時會造成圖形變形。 這個界限為沿著紋理 (u 或 v) 的位置,取樣紋理像素會在該位置從某個紋理像素轉換為另一紋理像素。 使用點取樣時,系統會選擇一個取樣紋理像素或另一個取樣紋理像素,當跨越界限時,結果可能會突然從某個紋理像素變更為下一個紋理像素。 這個效果可能會導致所顯示的紋理中出現不想要的圖形變形。 在使用線性篩選時,所產生的紋理像素會從兩個相鄰紋理像素之間計算,並在紋理索引跨越界限時,在兩者之間順暢地混和。

將非常小的紋理對應到非常大的多邊形,也就是進行所謂的放大時,就可以看到這個效果。 舉例來說,使用看起來像棋盤的紋理時,最接近點取樣會產生顯示不同邊緣且尺寸更大的棋盤。 相較之下,線性紋理篩選則會產生棋盤色彩在多邊形之間順暢改變的影像。

在多數案例中,應用程式會透過盡可能避免最接近點取樣,以得到最理想的結果。 現行的大多數硬體都已針對線性篩選最佳化,因此,您的應用程式應該不會遇到效能降低的情況。 如果您想要的效果一定需要使用最接近點取樣 (例如使用紋理顯示可閱讀的文字字元時),那麼,您的應用程式就必須非常謹慎地避免在紋理像素界限上取樣,以防造成不想要的效果。 下圖顯示這些變形的外觀範例。

illustration of a six-sectioned box with noncontinuous horizontal lines in the two upper-right squares

右上方的兩個正方形與看起來與其相鄰項目不太一樣,也就是當中發生了對角線偏移。 若要避免這類型的圖形變形,您必須熟悉 Direct3D 在最接近點篩選方面的紋理取樣規則。 Direct3D 會將從 [0.0, 1.0] (0.0 至 1.0,包含頭尾) 開始的浮點紋理座標對應至從 [ - 0.5, n - 0.5] 開始的整數紋理像素空間值,而後者的 n 代表紋理上指定維度中的紋理像素數量。 所產生的紋理索引會四捨五入為最接近的整數。 這個對應可能會在紋理像素界限造成取樣不準確。

在此提供一個簡單的範例:假設應用程式會使用包裝紋理定址模式來轉譯多邊形。 使用 Direct3D 採用的對應,寬度為 4 個紋理像素的 u 紋理索引就會透過下圖所示方式對應。

diagram of texture coordinates 0.0 and 1.0 at the boundary between texels

紋理座標 (圖例中的 0.0 和 1.0) 完全位於紋理像素之間的界限上。 使用由 Direct3D 對應值的方法,紋理座標就會從 [ - 0.5, 4 - 0.5] 開始,而當中的 4 則為紋理的寬度。 在這個案例中,針對 1.0 的紋理索引,取樣紋理像素的值為 0。 不過,如果紋理座標僅略小於 1.0,則取樣紋理像素的值就會是 n,而不是 0。

上述現象的意義在於:若在對齊三角形的螢幕空間上,透過最接近點篩選來使用正好為 0.0 和 1.0 的紋理像素座標放大小型紋理,就會在紋理像素之間的界限處產生紋理對應對其進行取樣的像素。 紋理座標計算中的發生任何不準確 (無論多麼細微),都會在對應至紋理對應之紋理像素邊緣的轉譯影像區域內造成變形。

使用完美的準確度來執行這個浮點紋理座標至整數紋理像素的對應,是一件相當困難的事,不僅計算起來十分耗時,通常也毫無必要性。 多數硬體實作都會使用反覆方法來計算三角形內每個像素位置的紋理座標。 反覆方法傾向隱藏這些不準確,原因在於:錯誤會在反覆過程中平均累積。

Direct3D 參考轉譯器會使用直接評估方法來計算每個像素位置的紋理索引。 直接評估與反覆方法的不同之處,在於作業中的任何不準確性都會表現為更加隨機的錯誤分佈。 因此,發生在界限的取樣錯誤可能會更加明顯,畢竟,參考轉譯器不會使用完美的準確度來執行這項作業。

最理想的應對方式,就是只在必要的時候使用最接近點篩選。 如果必須加以使用,則建議您將紋理座標從界限位置稍加位移,以避免產生變形。

紋理篩選