共用方式為


Nearest-Point 取樣 (Direct3D 9)

應用程式不需要使用紋理篩選。 可以設定 Direct3D,使其計算紋素位址,這通常不是整數,並複製最接近該整數位址的紋素色彩。 此程序稱為最接近點取樣。 如果紋理的大小類似於螢幕上基本影像的大小,則這是處理紋理的快速且有效率的方式。 如果沒有,則必須放大或縮小紋理。 結果可以是方塊狀、鋸齒狀或模糊的影像。

您的C++應用程式可以呼叫 IDirect3DDevice9::SetSamplerState 方法來選取最近的取樣。 將第一個參數的值設定為您選取紋理篩選方法的整數索引編號 (0-7)。 將 D3DSAMP_MAGFILTER、D3DSAMP_MINFILTER 或 D3DSAMP_MIPFILTER 作為第二個參數,以設定放大、縮小或多重解析度貼圖篩選。 在第三個參數中傳遞D3DTEXF_POINT。

您應該小心使用最近點取樣,因為當材質在兩個紋理像素的邊界上被取樣時,它有時會造成圖形偽影。 此界限是沿著紋理(u 或 v)的位置,取樣的紋素從一個紋素過渡到下一個紋素。 使用點取樣時,系統會選擇一個樣本紋素或另一個紋素,而且結果可能會在跨越界限時突然從一個紋素變更為下一個紋素。 此效果可能會在顯示的紋理中出現不希望的圖形瑕疵。 使用線性篩選時,產生的紋素是由相鄰的紋素計算得出,並在紋理索引越過邊界時,順暢地在兩者之間過渡混合。

當將非常小的紋理映射到非常大的多邊形時,可以看到這個效果,這通常稱為放大操作。 例如,使用看起來像棋盤的紋理時,最接近的點取樣會產生顯示不同邊緣的較大棋盤。 相反地,線性紋理篩選會產生影像,其中棋盤色彩會隨著多邊形而變化。

在大部分情況下,應用程式應盡可能避免使用最近點採樣,以獲得最佳結果。 現今大部分的硬體都已針對線性篩選進行優化,因此您的應用程式不應降低效能。 如果您想要的效果絕對需要使用最鄰近點取樣,例如在使用紋理顯示可讀取的文字字元時,您的應用程式應該非常小心,避免在圖素邊界處進行取樣,這可能會導致不期望的效果。 下圖顯示這些成品的外觀。

六格方塊的圖例,其中兩個右上方的方格中有非連續水平線

請注意,群組右上方的兩個方塊與周圍的方塊看起來不同,因為其上有對角線偏移。 若要避免這類圖形成品,您必須熟悉 Direct3D 紋理取樣規則,以便進行最近的點篩選。 Direct3D 會將浮點紋理座標從 [0.0, 1.0] (0.0 到 1.0,包含) 對應到介於 [ - 0.5, n - 0.5] 的整數紋素空間值,其中 n 是紋理上指定維度中的紋素數目。 產生的紋理索引會四捨五入為最接近的整數。 此對應可能在紋素邊界引入取樣不準確性。

舉個簡單的例子,假設有一個應用程式使用 D3DTADDRESS_WRAP 紋理尋址模式來轉譯多邊形。 根據 Direct3D 的對應方式,以下圖顯示了 u 紋理索引的對應方式,對於寬度為 4 紋素的紋理。

紋理座標的 圖表,介於紋素之間的界限邊界上,坐標為 0.0 和 1.0 的

請注意,此圖例的紋理座標 0.0 和 1.0 恰好位於紋素的邊界上。 使用 Direct3D 映射值的方法,紋理座標範圍從 [-0.5, 4 - 0.5],其中 4 是紋理的寬度。 在此情況下,對於紋理索引為 1.0 的情況,取樣的紋素是編號為 0 的紋素。 不過,如果紋理座標略小於 1.0,取樣的紋素會是 n 紋素,而不是 0 紋素。

這的含意在於,使用剛好0.0和1.0的紋理座標放大小型紋理,並在螢幕空間對齊的三角形上進行最接近點篩選,會產生紋理地圖在紋素之間的界限取樣的圖元。 在紋理座標計算中,即使是很微小的誤差,也會在渲染圖像中對應到紋理貼圖的紋素邊緣的地方產生偽影。

要將浮點紋理座標準確地映射到整數紋素,是困難的,計算耗時而且通常不需要。 大部分的硬體實作都會使用反覆方法,計算三角形內每個圖元位置的紋理座標。 迭代方法通常會隱藏這些錯誤,因為錯誤在迭代過程中會均勻累積。

Direct3D 參考轉譯器會使用直接評估方法來計算每個像素位置的紋理索引。 直接評估與反覆方法不同,因為作業中的任何錯誤都表現出更隨機的錯誤分佈。 因此,在邊界發生的取樣錯誤可能更加明顯,因為參考光柵化器無法以完美的精確度執行此操作。

最佳方法是只在必要時使用最接近點篩選。 當您必須使用它時,建議您將紋理座標從界限位置略微偏移,以避免瑕疵。

紋理篩選