Skip to main content

概觀

紋理並排 (Texture tiling),又稱為_紋理混排_ (texture swizzling),是 GPU 定義紋理 mipmap 排列方式以及每個 mipmap 內紋素索引方式的方法。本主題說明 XBOX Series X|S GPU 與 XBOX One (X) GPU 在 mipmap 配置及紋素排序方面的差異。XBOX Series X|S GPU 的混排模式與 XBOX One 世代的 GPU 不同。mip 層級內紋素的排序 (即_混排模式_) 已變更,mip 層級的排序與對齊方式也已變更。 與 XBOX One 世代相同,您可以使用 XG 程式庫來計算紋理 mip 配置與紋素混排模式。XBOX Series X|S 版本的 XG 稱為 XG_XS,可透過針對 xg_xs.h 和 xg_xs.lib 進行編譯與連結,在離線及執行階段使用。此 API 與 XBOX One XG 非常相似,變更之處包括與混排模式 (相對於並排模式) 相關的部分,以及輸出結構中的一些欄位已變更,以反映 XBOX Series X|S GPU 的新屬性。

Mipmap 配置

在 XBOX Series X|S GPU 上,mip 層級在記憶體中現在是以反向順序排列,最小的 mip 層級 (mip 尾端) 位於紋理內接近位移 0 的位置,接著是逐漸增大的 mip 層級,而最大的 mip 層級 (mip 0) 位於距離紋理基底位址最遠的位移處。陣列紋理的實作方式也不同,現在是以 mip 鏈結的陣列來實作 (例如,切片 0 的 mip n-0,接著是切片 1 的 mip n-0)。在 XBOX One 世代的 GPU 中,陣列紋理是以陣列的 mip 鏈結來實作 (例如,所有 mip 0 切片,接著是所有 mip 1 切片)。 使用 XG 程式庫的離線紋理處理程式碼,以及任何對 mip 排序與對齊方式有所假設的執行階段紋理串流程式碼,都需要配合新的 XBOX Series X|S 配置進行調整。 Mip 配置是以紋理區塊大小為基礎。混排模式的選擇 (定義如下) 會指定紋理區塊大小。可能的區塊大小有五種:線性、256 位元組、4 KB、64 KB 和可變。根據紋理維度 (1D、2D 或 3D) 以及以位元組為單位的元素大小,每種區塊大小都會定義 mip 高度與寬度的填補維度。將每個 mip 層級填補至區塊大小,表示 mip 位移會對齊至區塊大小。 為避免使用較大區塊大小 (4 KB 和 64 KB) 的 mipmap 紋理耗用過多記憶體,所有小於一個區塊的 mip 層級都會封裝至一個區塊大小的 mip 尾端,該尾端位於紋理配置中的位移 0。mip 尾端中的 mip 層級會以 256 位元組對齊。 對於較小的區塊大小 (線性和 256 位元組),mip 層級會以 256 位元組對齊,差異只在於填補維度。256 位元組區塊模式使用 2D/3D 填補維度,而線性區塊模式一律指定填補高度與深度為 1。 支援「可變」區塊大小的混排模式,但圖形驅動程式預設不會選取。VAR 混排模式的區塊大小在 Anaconda 上為 512 KB,在 Lockhart 上為 128 KB。 下列圖表顯示 48 × 24 的 2D 紋理在具有 6 個 mip 層級時,使用線性、256 位元組和 4 KB 區塊模式的配置。64 KB 的配置與 4 KB 配置類似,只是區塊大小較大 (mip 尾端也相應較大)。 使用線性區塊模式、具有 6 個 mip 層級的 48 × 24 2D 紋理圖表。 線性配置顯示 mip 層級從最小到最大排序,每個層級都對齊至 256 位元組。 使用 256 位元組區塊模式、具有 6 個 mip 層級的 48 × 24 2D 紋理圖表。 256 位元組配置顯示 mip 層級從最小到最大排序,每個層級都對齊至由紋素構成的矩形 256 位元組區塊。 使用 4 KB 區塊模式、具有 6 個 mip 層級的 48 × 24 2D 紋理圖表。 4 KB 配置顯示 mip 層級從最小到最大排序,每個層級都對齊至由紋素構成的矩形 4 KB 區塊。最小的 mip 層級會封裝至 mip 尾端,而 mip 尾端可完全容納於一個 4 KB 區塊內。64 KB 配置的運作方式與 4 KB 配置相同,只是區塊大小為 64 KB。 陣列紋理是以 mip 鏈結的陣列來實作。對於具有 2 個以上切片的陣列紋理,可以想像成 2 個以上的 mip 鏈結在記憶體中首尾相接。下圖顯示同樣具有 6 個 mip 層級的 48 × 24 2D 紋理,但這次具有 2 個陣列切片。 使用 4 KB 區塊模式、具有 6 個 mip 層級及 2 個陣列切片的 48 × 24 2D 紋理圖表。 立方體貼圖與立方體貼圖陣列是陣列紋理的特殊情況,其切片數目必須是 6 的倍數。在紋理定址方面,請將立方體貼圖視為與標準 2D 陣列紋理相同。 3D (體積) 紋理的實作方式與 2D 紋理類似,差別在於每個區塊代表的是由紋素元素構成的 3D 區域,而非 2D 矩形。體積的切片實作方式與陣列紋理的切片類似,差別在於由於區塊對齊,體積的每個切片具有大於 1 的切片深度。因此,mipmap 體積紋理的個別 mip 層級在記憶體中可能不連續,因為它們分散在多個切片中。體積紋理無法建立為陣列。

XG 配置結構

XGTextureAddressComputer 物件是 XG 內的主要介面。它提供配置計算與紋素定址方法。輸出配置結構 XG_RESOURCE_LAYOUT 包含一到四個平面 (XG_PLANE_LAYOUT),而每個平面包含一或多個 mip 層級 (XG_MIPLEVEL_LAYOUT)。 計算 XBOX Series X|S 紋理配置時,這三個配置結構的下列成員值得注意。

XG_RESOURCE_LAYOUT

  • SizeBytes 是影像的總大小,包括所有平面。
  • BaseAlignmentBytes 是影像的基底對齊。每個平面可能有自己的對齊值,但 XG_RESOURCE_LAYOUT::BaseAlignmentBytes 是所有平面中的最大對齊值。
  • MipLevels 是影像中存在的 mip 層級數目。在大多數情況下,如果是 mipmap 紋理,只有其中一個平面可以包含多個 mip 層級。

XG_PLANE_LAYOUT

  • Usage 是平面的用途:主要表面 (樣本或紋素) 為 “DEFAULT”、“DEPTH” 或 “STENCIL”;壓縮中繼資料為 “HTILE”、“FMASK”、“CMASK” 或 “DELTA_COLOR_COMPRESSION”;雙平面多媒體格式影像則為 “LUMA” 或 “CHROMA”。
  • SizeBytes 是平面的總大小,包括所有陣列切片。
  • SliceSizeBytes 是單一 mip 鏈結的總大小,構成一個陣列切片。
  • StandardMipCount 是不屬於 mip 尾端的 mip 層級數目。
  • MipTailMipCount 是屬於 mip 尾端的 mip 層級數目。

XG_MIPLEVEL_LAYOUT

  • SizeBytes 是此 mip 層級的大小。
  • OffsetBytes 是此 mip 層級相對於 mip 鏈結基底的位移。
  • 對於 2D (陣列) 紋理,Slice2DSizeBytes 等同於 SizeBytes;對於 3D 紋理,則為一個深度切片的大小。
  • PaddedWidthElements、PaddedHeightElements 和 PaddedDepthOrArraySize 是 mip 層級的維度 (以紋素元素為單位),已填補至所選混排模式對應的區塊大小。請記住,BC 壓縮區塊是一個紋素元素,大小為 4 × 4 紋素。
  • 如果此 mip 層級屬於 mip 尾端,IsMipTail 為 1;如果不屬於 mip 尾端,則為 0。

XG_MIPLEVEL_LAYOUT 的 XBOX Series X|S 硬體注意事項

  • 在具有多個切片的陣列紋理中,SizeBytes 只會反映一個切片的大小。對於體積紋理,SizeBytes 會反映所有「深度切片」的大小,但這些切片在記憶體中可能不連續。
  • OffsetBytes 會反映此 mip 層級在第一個陣列切片中的位移。若要計算此 mip 層級在切片 1-n 中的位移,請將 OffsetBytes 加上平面配置的 SliceSizeBytes 乘以切片索引。
  • 請注意,對於體積紋理,每個 mip 層級在記憶體中可能不連續。若要判斷體積 mip 層級所佔用的記憶體範圍,請使用 PlaneLayout.SliceSizeBytes * DepthSliceIndex + MipLayout.OffsetBytes 作為每個範圍的起始位移,並使用 StartOffset + MipLayout.SliceSizeBytes * MipLayout.SliceDepthElements 作為每個範圍的結束位移。mip 層級的深度切片數目為 mip 深度除以 MipLayout.SliceDepthElements。

混排模式

與 XBOX One 類似,每個影像描述元、轉譯目標和深度/樣板目標都可以從 32 種不同的紋理並排模式中選取一種,在 XBOX Series X|S 上稱為_混排模式_,在 XBOX One 上則稱為_並排模式_。不過,相似之處僅止於此,因為在 XBOX Series X|S 上建構每種模式的方式與 XBOX One 相當不同。除了線性配置之外,XBOX Series X|S 與 XBOX One 之間沒有共通的紋理並排模式。 XBOX Series X|S GPU 上的每種混排模式都有數個屬性,這些屬性會在混排模式的名稱中標示。
  1. 區塊大小: 並排模式的基本單位大小,以位元組數目指定。區塊大小可以是 256 位元組、4 KB、64 KB、「可變」(512 KB 或 128 KB) 或線性。
  2. 微並排模式: 區塊內紋素元素的配置。微並排模式包括 “S”、“D”、“R” 和 “Z”。對於某些元素大小,S 與 D 模式是相同的。線性混排模式沒有微並排。
  3. 管線 XOR 模式: 紋素定址是否在 XOR 混排作業中使用管線位元。XOR 設定包括 “X”、“T” 以及無管線 XOR。所有具有管線 XOR (“X” 或 “T”) 的混排模式,其混排模式都特定於硬體組態 (Anaconda 與 Lockhart),因此離線進行混排時必須特別小心。“X” 管線混排會跨越多個區塊,而 “T” 管線混排則限制在每個區塊內。
下表說明 32 種不同的混排模式、它們目前的用途,以及是否允許轉譯目標檢視、深度樣板檢視和體積紋理。

其他混排模式注意事項

XBOX Series X|S GPU 以位元組為單位定義區塊大小,而非以紋素元素為單位。這表示當紋素元素的位元組大小增加時,每個區塊中的紋素就會減少。這與 XBOX One GPU 不同,後者將主要區塊大小定為 8 × 8 個紋素元素,與元素大小無關。 由於區塊大小以位元組為單位保持固定,因此混排模式 “S”、“D”、“R” 和 “Z” 對於不同的元素大小會有不同的解讀方式。此外,2D 紋理與 3D 紋理的混排模式完全不同。

另請參閱

圖形
Last modified on October 6, 2026