Share via


使用 Mipmap 的紋理篩選

Mipmap 為一系列的紋理,每個紋理都會使用逐漸降低的解析度來呈現相同的影像。 Mipmap 中每個影像 (或層級) 的高度和寬度,都會比上一個層級小二次方。 Mipmaps 不一定要是正方形。

高解析度的 Mipmap 影像會用於靠近使用者的物件。 解析度較低的影像則會用於看起來較遠的物件。 Mipmap 作業雖可改善轉譯紋理的品質,卻也需要使用更多的記憶體。

Direct3D 會以附加表面鏈的形式呈現 Mipmap。 解析度最高的紋理會位於附加表面鏈的最前方,並隨附下一個層級的 Mipmap,以做為附件。 而該層級也會隨附下一個 Mipmap 層級以做為附件,並依此類推,直到最低解析度的 Mipmap 層級為止。

下圖顯示這些層級的範例。 點陣圖紋理代表第一人稱 3D 遊戲中位於容器上的標誌。 建立為 Mipmap 時,最高解析度紋理會位於集合中的最前端。 Mipmap 集合中的每個後續紋理,其寬度和高度都會比上一個紋理小二次方。 在此案例中,最大解析度的 Mipmap 為 256 x 256 像素。 下一個紋理為 128 x 128。 附加表面鏈的最後一個紋理則為 64 x 64。

這個標誌的可見距離設有上限。 當使用者開始遠離標誌時,遊戲就會顯示 Mipmap 鏈中的最小紋理,也就是本案例中的 64 x 64 紋理。

illustration of a 64x64 texture of a danger sign

當使用者將視野移至靠近標誌處,就會使用 Mipmap 鏈中解析度逐漸提高的紋理。 下圖的解析度為 128 x 128。

illustration of a 128x128 texture of a danger sign

當使用者的視野位於該標誌所允許的最小距離時,就會使用最高解析度紋理,如下圖所示。

illustration of a 256x256 texture of a danger sign

如此即可透過更有效率的方式來模擬紋理的角度。 這樣一來,就能更快速地使用具有不同解析度的多個紋理,而非將單一紋理轉譯為多個解析度。

Direct3D 可評估 Mipmap 集合中的哪個紋理為最接近所需輸出的解析度,並將像素對應至其紋理像素空間。 如果最終影像的解析度介於 Mipmap 集合中的多個紋理解析度之間,Direct3D 可檢查 Mipmap 並混合其色彩值。

若要使用 Mipmap,應用程式必須建置一個 Mipmap 集合。 應用程式會選取 Mipmap 集合做為現行紋理集合中的首個紋理,藉此套用 Mipmap。 詳情請參閱紋理混合

隨後,應用程式必須設定 Direct3D 用來為紋理像素取樣的篩選方法。 進行 Mipmap 篩選的最快速方法,就是讓 Direct3D 選取最接近的紋理像素。 使用 D3DTEXF_POINT 列舉的值,即可加以選取。 如果應用程式使用 D3DTEXF_LINEAR 列舉的值,Direct3D 就能產生更出色的篩選結果。 這會選取最接近的 Mipmap,然後計算目前像素所對應之紋理周圍的紋理像素加權平均。

Mipmap 紋理會用於 3D 場景中,藉此減少轉譯場景的所需時間。 此外,它們也有助於提高場景的逼真度。 不過,它們經常需要使用大量的記憶體。

注意:Mipmap 鏈中的每個表面都具有維度,而該維度皆為 Mipmap 鏈中上一個表面的一半。 如果最上層 Mipmap 的維度為 256 x 128,第二層 Mipmap 的維度就會是 128 x 64,而第三層則為 64 x 32,並依此類推,直到 1 x 1 為止。 您無法在 [層級] 中要求會導致 Mipmap 鏈中任何 Mipmap 寬度或高度小於 1 的 Mipmap 層級數量。 在使用 4 x 2 最上層 Mipmap 表面的簡單案例中,[層級] 允許的最大值為 3。 最上層的維度為 4 x 2、第二層的維度為 2 x 1,而第三層的維度為 1 x 1。 [層級] 中的值若大於 3,就會導致第二層 Mipmap 的高度出現小數值,因此不被允許。

 

Direct3D 可自動執行 Mipmap 紋理篩選作業。 應用程式可手動周遊 Mipmap 鏈,以便將點陣圖資料載入至 Mipmap 鏈中的每個表面。 通常,這正是周遊 Mipmap 鏈的唯一理由。 在紋理建立時自動產生 Mipmap,即可善加利用硬體篩選,因為 Mipmap 會位於視訊記憶體中。

紋理篩選