共用方式為


Nearest-Point取樣 (Direct3D 9)

使用紋理篩選不需要應用程式。 可設定 Direct3D 讓它計算紋素位址,其通常不評估整數,並以最接近的整數位址複製紋素色彩。 這個過程稱作最近點取樣。 如果紋理大小類似于螢幕上基本影像的大小,這可以是處理紋理的快速且有效率的方式。 若非如此,則必須放大或縮小紋理。 結果可以是區塊、別名或模糊影像。

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

您應該謹慎使用最接近點的取樣,因為它有時會在紋理在兩個材質之間的界限取樣時造成圖形成品。 這個邊界是沿著紋理 (u or 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 軟體模擬轉譯器使用直接評估方法,在每個像素位置運算紋理指數。 直接評估不同於反覆式方法,操作中任何不準確會更加隨機顯示錯誤散發。 此結果是在邊界發生的取樣錯誤會更明顯,因為 Direct3D 軟體模擬轉譯器未準確地執行此作業。

最好的方法是只在需要時使用最接近點篩選。 當您必須使用它時,建議您將紋理座標稍微從邊界位置偏移,以避免造成假性影像。

紋理篩選