雙線性紋理篩選

雙線性紋理篩選會計算最接近取樣點之 4 個紋理像素的加權平均。 這個篩選方法比最接近點篩選更加精確且常見。 由於它會在現代化圖形硬體上執行,因此為效率十足的方法。

範例

紋理一律從左上角的 (0.0,0.0) 到右下角的 (1.0,1.0) 線性尋址。 下圖顯示紋理的線性尋址。

illustration of 4x4 texture with solid blocks of color

紋理通常以純色區塊組成的方式表示,但以您應該考慮點陣顯示的方式思考紋理實際上更為正確:每個紋素都是在方格資料格的確切中心定義,如下圖所示。

illustration of 4x4 texture with texels defined at the center of the grid cells

如果您在 UV 座標 (0.375,0.375) 上詢問紋理取樣器此紋理的色彩,您會得到純紅色 (255,0,0)。 這很合理,因為紅色紋素資料格的中心位於 UV (0.375,0.375)。 如果您向取樣器詢問紋理在 UV (0.25,0.25) 下的顏色會怎麼樣? 這並不容易,因為 UV (0.25,0.25) 處的點正好位於 4 個紋素的角落。

最簡單的配置只是讓取樣器傳回最接近紋素的色彩;這稱為點篩選 (請參閱最接近點取樣),而且通常是由於粒紋或區塊結果而不需要的。 在 UV (0.25, 0.25) 處對紋理進行點取樣顯示了最近點過濾的另一個微妙問題:有四個距取樣點等距的紋素,因此沒有單一最近的紋素。 將選擇這四個紋理像素之一做為傳回的色彩,但選擇取決於座標的四捨五入方式,這可能會引入撕裂成品 (請參閱 SDK 中的最近點取樣文章)。

稍微準確且更常見的篩選配置是計算距離取樣點最接近 4 個紋素的加權平均值:這稱為雙線性篩選。 雙線性篩選的額外計算成本通常可以忽略不計,因為此例程是在現代圖形硬體中實作的。 以下是我們使用雙線性篩選來取得幾個不同樣本點的色彩:

UV: (0.5, 0.5)

此點位於紅色、綠色、藍色和白色紋素之間的精確邊界。 取樣器傳回的色彩為灰色:

  0.25 * (255, 0, 0)
  0.25 * (0, 255, 0) 
  0.25 * (0, 0, 255) 
## + 0.25 * (255, 255, 255) 
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)

此點位於紅色和綠色紋素之間邊界的中點。 取樣器傳回的顏色是黃灰色 (請注意,藍色和白色紋素的貢獻調整為 0):

  0.5 * (255, 0, 0)
  0.5 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)

這是紅色紋素的位址,它是傳回的色彩 (篩選計算中的所有其他紋素都加權為 0):

  1.0 * (255, 0, 0)
  0.0 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (255, 0, 0)

將這些計算與下圖進行比較,下圖顯示如果在 4x4 紋理中的每個紋理位址執行雙線性篩選計算會發生什麼。

illustration of 4x4 texture with bilinear filtering performed at every texture address

紋理篩選