共用方式為


紋理簡介

紋理資源為用來儲存紋理像素的資料結構,而紋理像素則為可供讀取或寫入的最小紋理單位。 當著色器讀取紋理時,可使用紋理取樣器來篩選紋理。

紋理資源是專為儲存紋理像素所設計的一系列結構化資料。 紋理像素代表紋理的最小單位,且可由管線讀取或寫入。 不同於緩衝區,紋理可使用紋理取樣器篩選,因為它們會由著色器單位讀取。 紋理類型會影響紋理的篩選方式。 每個紋理像素會包含 1 個到 4 個原件,並按照 DXGI_FORMAT 列舉所定義的其中一個 DXGI 格式來排列。

紋理會建立為大小已知的結構化資源。 不過,在資源建立時,每個紋理都有可能具類型或不具類型,只要類型會在紋理繫結至管線時使用檢視來完整指定,就不會發生問題。

紋理類型

Direct3D 支援多種浮點表示法。 所有浮點運算都會在 IEEE 754 32 位元單精確度浮點規則定義的子集下運作。

紋理包含多種類型:1D、2D 和 3D,而每個類型都可使用或不使用 Mipmap 加以建立。 Direct3D 也支援紋理陣列和多重取樣紋理。

1D 紋理

1D 紋理為最簡單的形式,而當中包含的紋理資料可使用單一紋理座標來定址;它可視覺化為紋理像素陣列,如下圖所示。

下圖顯示 1D 紋理:

1d 紋理

視儲存資料的格式而定,每個紋理像素都包含多個色彩元件。 只要新增更多複雜度,您就能建立具有 Mipmap 層級的 1D 紋理,如下圖所示。

具有 Mipmap 層級的 1d 紋理

Mipmap 層級是一種紋理,會比上一個層級小二次方。 最上層包含最多詳細資料,每個後續層級都會越來越小。 針對 1D Mipmap,最小的層級會包含一個紋理像素。 此外,MIP 層級一律會減至 1:1。

為奇數大小的紋理產生 Mipmap 時,下一個較低層級一律為偶數大小 (除非在最低層級達到 1 時)。 舉例來說,圖中顯示了 5x1 紋理,其下一個最低層級為 2x1 紋理,而該紋理的下一個 (也就是最後一個) MIP 層級為 1x1 大小的紋理。 層級會由名為 LOD (詳細資料層級) 的索引識別,當轉譯與相機具有相當距離的幾何時,該索引可用來存取較小的紋理。

1D 紋理陣列

Direct3D 也支援紋理陣列。 就概念上而言,1D 紋理陣列會如下圖所示。

1d 紋理的陣列

這個紋理陣列包含三個紋理。 三個紋理的寬度都是 5 (這也是第一層中的元素數量)。 每個紋理也包含一個 3 層 Mipmap。

Direct3D 中的所有紋理陣列都是紋理的同質陣列;這表示,紋理陣列中的每個紋理,都必須使用相同的資料格式和大小 (包括紋理寬度和 Mipmap 層級的數量。) 您可以建立不同大小的紋理陣列,只要每個陣列中的所有紋理都使用相同的大小即可。

2D 紋理和 2D 紋理陣列

Texture2D 資源包含一個 2D 紋理像素方格。 每個紋理像素都可透過 u、v 向量定址。 鑑於它是紋理資源,因此,當中可能包含 Mipmap 層級和子資源。 完整填入的 2D 紋理資源會如下圖所示。

2d 紋理資源

這個紋理資源包含單一 3x5 紋理,且具有三個 Mipmap 層級。

2D 紋理陣列資源為 2D 紋理的同質陣列;這表示,每個紋理都有相同的資料格式和維度 (包括 Mipmap 層級)。 其配置與 1D 紋理陣列相似,而兩者的差異在於:紋理現在包含 2D 資料,因此會如下圖所示。

2d 紋理的陣列

這個紋理陣列包含三個紋理;每個紋理都是 3x5,且具有兩個 Mipmap 層級。

將 2D 紋理陣列做為紋理立方體

紋理立方體是一個 2D 紋理陣列,當中包含 6 個紋理,立方體的每一面各一個紋理。 完整填入的紋理立方體會如下圖所示。

代表紋理立方體之 2d 紋理的陣列

包含 6 個紋理的 2D 陣列使用立方體紋理檢視繫結至管線後,就能從具有立方體對應內建函式的立方體著色器中讀取。 紋理立方體可從具有自紋理立方體中心指向之 3D 向量的著色器來定址。

3D 紋理

3D 紋理資源 (又稱為體積紋理) 包含一個 3D 紋理像素體積。 由於它是紋理資源,因此可能包含 Mipmap 層級。 完整填入的 3D 紋理會如下圖所示。

3d 紋理資源

當 3D 紋理 Mipmap 配量繫結為轉譯目標輸出 (使用轉譯目標檢視) 時,3D 紋理的行為就會與具有 n 配量之 2D 紋理相同。 特定轉譯配量會從幾何著色器階段選取。

由於 3D 紋理陣列概念並不存在;因此,3D 紋理子資源為單一 Mipmap 層級。

Direct3D 的座標系統會針對像素和紋理像素定義。

像素座標系統

Direct3D 中的像素座標系統會定義左上角的轉譯目標原點,如下圖所示。 像素中心會從整數位置位移 (0.5f,0.5f)。

direct3d 10 中像素座標系統的圖表

紋理像素座標系統

紋理像素座標系統的原點會位於紋理的左上角,如下圖所示。 這可讓轉譯與螢幕對齊的紋理顯得不再重要,畢竟,像素座標系統會與紋理像素座標系統對齊。

紋素座標系統的圖表

紋理座標會透過正規化或尺度數值表示;每個紋理座標都會對應至特定紋理像素,如下圖所示:

針對正規化座標:

  • 點取樣:紋理像素 # = floor(U * 寬度)
  • 線性取樣:左側紋理像素 # = floor(U * 寬度), 右側紋理像素 # = Left Texel # + 1

針對尺度座標:

  • 點取樣:紋理像素 # = floor(U)
  • 線性取樣:左側紋理像素 # = floor(U - 0.5), 右側紋理像素 # = 左側紋理像素 # + 1

當中的寬度為紋理寬度 (以紋理像素為單位)。

紋理位址包裝會發生在紋理像素位置計算完成後。

紋理