Direct3D 11 中的紋理簡介

紋理資源是設計來儲存紋素的結構化資料集合。 紋素代表管線可讀取或寫入的最小紋理單位。 和緩衝區不同的是,紋理可依紋理樣本篩選,由著色器單位讀取。 紋理類型會影響篩選紋理的方式。 每個紋素都包含 1 到 4 個元件,以DXGI_FORMAT列舉所定義的其中一種 DXGI 格式排列。

建立具已知大小的紋理為結構化資源。 不過,每個紋理在建立資源之後可能有型別或無型別,只要當紋理與管線繫結時使用檢視完全指定型別。

紋理類型

有數種紋理類型︰1D、2D、3D,每一個都可使用或不使用 Mipmap 建立。 Direct3D 11 也支援紋理陣列和多重取樣紋理。

1D 紋理

最簡單形式的 1D 紋理所包含的紋理資料,可以使用單一紋理座標處理,它可以視覺化為紋素陣列,如下圖所示。 1D 紋理是由 ID3D11Texture1D 介面表示。

1D 紋理的圖例

每個紋素根據所儲存的資料格式包含許多色彩元件。 增加更多複雜度,您可以使用 Mipmap 層次建立 1D 紋理,如下圖所示。

具有 Mipmap 層次之 1D 紋理的圖例

Mipmap 層次是比上層小二的 n 次方的紋理。 最上層包含大部分的細節,每個後續的層次較小。 對於 1D Mipmap,最小層級包含一個紋素。 此外,MIP 層級一律降至 1:1。 當專為特別尺寸紋理產生 Mipmap, 下一個較低層次一律為均勻大小 (除了最低層到達 1 以外)。 例如,圖表顯示 5x1 紋理,其下一個最低層為 2x1 紋理,其下一個 (和上一個) MIP 層是 1x1 大小的紋理。 由稱為 LOD (細節層次) 的索引識別的層次,會在呈現不是那麼靠近相機的幾何圖形時,用於存取較小的紋理。

1D 紋理陣列

Direct3D 11 也支援紋理陣列。 1D 紋理陣列也會以 ID3D11Texture1D 介面表示。 1D 紋理陣列概念上看起來像下圖。

1d 紋理陣列的圖例

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

在 Direct3D 中的所有紋理陣列都是同質紋理陣列,這表示紋理陣列中的每種紋理必須有相同資料格式和大小 (包括紋理寬度和 Mipmap 層次數目)。 只要每一個紋理陣列中的所有紋理大小都相符,您可以建立不同大小的紋理陣列。

2D 紋理和 2D 紋理陣列

Texture2D 資源包含 2D 紋格。 每個紋素是由 u、v 向量定位。 因為是紋理資源,它可能包含 mipmap 層次和子資源。 2D 紋理是由 ID3D11Texture2D 介面表示。 完全填充的 2D 紋理資源看起來如下圖。

2D 紋理資源的圖例

這個紋理資源包含具三個 Mipmap 層次的單一 3x5 紋理。

2D 紋理陣列資源是同質 2D 紋理陣列,也就是每個紋理都有相同的資料格式和尺寸 (包括 Mipmap 層次)。 2D 紋理陣列也會以 ID3D11Texture2D 介面表示。 它有類似 1D 紋理的版面配置,現在包含 2D 資料的紋理除外,如下圖所示。

2d 紋理陣列的圖例

這個紋理包含三個紋理,每個紋理為 3x5 含兩個 Mipmap 層次。

使用 2D 紋理陣列做為立體紋理

紋理立方體是包含 6 個紋理的 2D 紋理陣列,每個立方體表面一個紋理。 完全填充的紋理立方體如下圖所示。

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

包含 6 個紋理的 2D 紋理陣列,在使用立方體紋理視圖結合管線後,可使用立方體內建功能從著色器內讀取。 使用從紋理立方體中心指出的 3D 向量,從著色器處理紋理。

注意

您使用 10_1 功能層級 和更新版本所建立的裝置可支援紋理立方體陣列,其中紋理數目等於陣列中的紋理立方體數目六。 您使用 10_0 功能層級 建立的裝置僅支援 6 張臉部的單一紋理立方體。 此外,Direct3D 11 不支援部分 Cubemap。

 

3D 紋理

3D 紋理資源 (也稱為容體紋理) 包含 3D 紋理元素量。 因為是紋理資源,所以可會包含 mipmap 層次。 3D 紋理是由 ID3D11Texture3D 介面表示。 完全填充的 3D 紋理外觀如下圖所示。

3D 紋理資源的圖例

3D 紋理 Mipmap 切片繫結為描繪目標輸出 (描繪目標視圖) 時,3D 紋理行為等同於具 n 切片的 2D 紋理陣列。 從幾何著色器階段選擇特定的轉譯配量,方法是將輸出資料的純量元件宣告為系統值SV_RenderTargetArrayIndex。

沒有 3D 紋理陣列概念,因此 3D 紋理子資源是單一 Mipmap 層次。

紋理