共用方式為


可變速率底紋 (VRS)

VRS 的動機

由於效能限制,圖形轉譯器不一定能夠將相同的品質層級傳遞給其輸出影像的每個部分。 可變速率底紋或粗圖元底紋是一種機制,可讓您以不同轉譯影像的速率配置轉譯效能/電源。

在某些情況下,底紋速率可以減少,幾乎不會降低可察覺的輸出品質:導致效能改善,基本上是免費的。

沒有 VRS — 具有超級取樣的多樣本消除鋸齒

如果沒有可變速率底紋,控制底紋速率的唯一手段是使用多重樣本反鋸齒(MSAA)搭配取樣式執行(也稱為超級取樣)。

MSAA 是減少幾何別名的機制,相較於不使用 MSAA,改善影像的轉譯品質。 MSAA 樣本計數,可以是 1x、2x、4x、8x 或 16x,可控管每個轉譯目標圖元配置的樣本數目。 在配置目標時,MSAA 範例計數必須預先知道,且之後無法加以變更。

超取樣會導致每個樣本叫用圖元著色器一次,品質較高,但效能成本也比每像素執行高。

您的應用程式可以藉由選擇以每個像素為基礎的執行或 MSAA-with-supersampling 來控制其底紋速率。 這兩個選項不提供非常精細的控制。 此外,相較於影像的其餘部分,您可能想要特定類別物件的底紋速率較低。 這類物件可能包括 HUD 元素後面的物件,或透明度、模糊(場深度、運動等),或 VR 光學造成的光學失真。 但這是不可能的,因為陰影品質和成本會固定在整個影像上。

使用可變速率底紋 (VRS)

可變速率底紋(VRS)模型藉由新增粗陰影的概念,將超取樣與 MSAA 延伸至相反的「粗圖元」方向。 這是底紋可以比圖元更粗的頻率執行的地方。 換句話說,一組圖元可以著色為單一單位,然後結果會廣播到群組中的所有樣本。

粗陰影 API 可讓您的應用程式指定屬於陰影群組的像素數目,或 粗圖元。 在配置轉譯目標之後,您可以改變粗略圖元大小。 因此,螢幕的不同部分或不同的繪製階段可能會有不同的底紋速率。

下表描述支援粗圖元大小的 MSAA 層級,以支援粗略底紋的平臺:

  • 針對標示為 Y的數據格,會啟用該組合。
  • 對於標示為 Cap的單元格,該組合會根據上限(AdditionalShadingRatesSupported) 有條件地啟用。
  • 對於空白儲存格,不支援該組合。
  • 對於半色調陰影的儲存格,該組合不受支援, 它涉及追蹤每個圖元著色器調用超過16個樣本。 對於追蹤超過16個樣本,相較於其他案例,還有額外的硬體對齊障礙可支援。

數據表顯示 M A 層級的粗圖元大小。

功能層

VRS 實作有兩個層級,還有兩個您可以查詢的功能。 數據表之後會更詳細地描述每一層。

表格顯示第 1 層和第 2 層中可用的功能。

第 1 層

  • 底紋速率只能以每一繪製為基礎來指定;沒有比這更細微的了。
  • 底紋速率會統一套用至與其位於轉譯目標內的位置無關繪製的內容。

第 2 層

  • 底紋速率可以依每一繪製方式指定,如第 1 層所示。 也可以透過每一繪製基礎的組合,以及下列專案來指定:
    • 每個引發頂點的語意,以及
    • 屏幕空間影像。
  • 三個來源的底紋速率會使用一組結合器來合併。
  • 屏幕空間影像磚大小為 16x16 或更小。
  • 應用程式所要求的底紋速率保證會完全傳遞(適用於時態性和其他重建篩選器的精確度)。
  • 支援SV_ShadingRate PS 輸入。
  • 使用單一檢視區且未寫入 SV_ViewportArrayIndex 時,每個挑釁頂點(也稱為個別基本)底紋速率都是有效的。
  • 如果 SupportsPerVertexShadingRateWithMultipleViewports 功能設定為 true,則每個引發頂點速率可以搭配多個檢視區使用。 此外,在此情況下,寫入 SV_ViewportArrayIndex 時可以使用該速率。

功能清單

  • AdditionalShadingRatesSupported
    • 布爾值類型。
    • 指出單一取樣轉譯是否支援 2x4、4x2 和 4x4 粗圖元大小;以及 2x MSAA 是否支援粗略圖元大小 2x4。
  • SupportsPerVertexShadingRateWithMultipleViewports
    • 布爾值類型。
    • 指出是否可以搭配每個頂點使用多個檢視區(也稱為個別基本類型)底紋速率。

指定底紋速率

針對應用程式中的彈性,提供各種不同的機制來控制底紋速率。 根據硬體功能層,可以使用不同的機制。

命令清單

這是設定底紋速率的最簡單機制。 可在所有層上使用。

您的應用程式可以使用 ID3D12GraphicsCommandList5::RSSetShadingRate 方法來指定粗略像素大小,。 該 API 會採用單一列舉自變數。 API 會提供轉譯品質層級的整體控制—能夠在每一繪製的基礎上設定底紋速率。

此狀態的值會透過 D3D12_SHADING_RATE 列舉來表示。

粗圖元大小支援

所有層級都支援底紋速率 1x1、1x2、2x1 和 2x2。

AdditionalShadingRatesSupported的功能,指出裝置是否支援 2x4、4x2 和 4x4。

螢幕空間影像 (影像型)

在第 2 層和更高層級上,您可以使用螢幕空間影像來指定圖元底紋速率。

螢幕空間影像可讓您的應用程式建立「詳細層級(LOD)遮罩」影像,指出不同質量的區域,例如動作模糊、深度字段模糊、透明物件或 HUD UI 元素所涵蓋的區域。 影像的解析度位於 macroblocks 中;它不在轉譯目標的解析度中。 換句話說,陰影速率數據是以 8x8 或 16x16 像素磚的數據粒度來指定,如 VRS 磚大小所指示。

磚大小

您的應用程式可以查詢 API,以擷取其裝置支援的 VRS 磚大小。

磚是方形的,而大小是指圖格的寬度或高度在紋素中。

如果硬體不支援第 2 層可變速率底紋,則磚大小的功能查詢會傳回 0。

如果硬體 支援第 2 層可變速率底紋,則磚大小就是下列其中一個值。

  • 8
  • 16
  • 32

螢幕空間影像大小

針對大小為 {rtWidth, rtHeight} 的轉譯目標,使用名為 VRSTileSize的指定磚大小,將會涵蓋它的螢幕空間影像是這些維度。

{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }

螢幕空間影像的左上方 (0, 0) 會鎖定至轉譯目標左上方 (0, 0)。

若要查閱對應至轉譯目標中特定位置之磚的 (x,y) 座標,請將 (x, y) 的視窗空間座標除以磚大小,忽略小數位。

如果螢幕空間影像大於指定的轉譯目標,則不會使用右邊和/或底部的額外部分。

如果螢幕空間影像對於指定的轉譯目標而言太小,則任何嘗試從影像讀取超出其實際範圍時,會產生預設底紋速率 1x1。 這是因為螢幕空間影像的左上方 (0, 0) 鎖定在轉譯目標左上角 (0, 0) 和 「超出轉譯目標範圍讀取」表示讀取 x 和 y 的值太大。

格式、版面配置、資源屬性

此表面的格式是單通道 8 位表面(DXGI_FORMAT_R8_UINT)。

資源是維度 TEXTURE2D

無法進行陣列或裁剪。 它必須明確具有一個 mip 層級。

其樣本計數為 1,樣本品質為 0。

其紋理配置 UNKNOWN。 因為不允許交叉配接器,所以無法隱含地成為數據列主要版面配置。

屏幕空間影像數據填入的預期方式是其中之一

  1. 使用計算著色器寫入數據;屏幕空間影像系結為UAV,或
  2. 將資料複製到螢幕空間影像。

建立螢幕空間影像時,允許這些旗標。

  • 沒有
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

不允許這些旗標。

  • ALLOW_RENDER_TARGET
  • ALLOW_DEPTH_STENCIL
  • ALLOW_CROSS_ADAPTER
  • ALLOW_SIMULTANEOUS_ACCESS
  • VIDEO_DECODE_REFERENCE_ONLY

資源的堆積類型不能是UPLOAD或READBACK。

資源無法SIMULTANEOUS_ACCESS。 不允許資源交叉配接器。

數據

屏幕空間影像的每個位元組都會對應至 D3D12_SHADING_RATE 列舉的值。

資源狀態

當做螢幕空間影像使用時,資源必須轉換成只讀狀態。 唯讀狀態 D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE定義為此用途。

映射資源會從該狀態轉換,以再次變成可寫入。

設定影像

用於指定著色器速率的螢幕空間影像是在命令清單上設定。

已設定為底紋速率來源的資源無法從任何著色器階段讀取或寫入。

您可以設定 null 螢幕空間影像來指定著色器速率。 這有 1x1 的效果,一致地用來作為螢幕空間影像的貢獻。 螢幕空間影像一開始可以視為設定為 null

升階和衰敗

屏幕空間影像資源對於升階或衰變沒有任何特殊影響。

每一基本屬性

每個基本屬性新增了將底紋速率字詞指定為引發頂點的屬性的能力。 這個屬性是平面陰影,也就是說,它會傳播到目前三角形或線條基本類型中的所有圖元。 相較於其他底紋速率規範,使用每個基本屬性可以更精細地控制影像品質。

每個基本屬性是名為 SV_ShadingRate的可設定語意。 SV_ShadingRate 存在於 HLSL 著色器模型 6.4的一部分。

如果 VS 或 GS 設定 SV_ShadingRate,但未啟用 VRS,則語意設定沒有作用。 如果未為每個基本類型指定任何 SV_ShadingRate 值,則會假設底紋速率值為 1x1,做為每個基本類型的貢獻。

結合底紋速率因素

此圖表會依序套用各種底紋速率來源。

圖表顯示管線狀態、標示為 A、具有引發頂點底紋速率、標示為 B、套用在合併器上,然後以影像為基礎的底紋速率、標示為 B、套用在組合器。

每對 A 和 B 都會使用結合器來結合。

* 依頂點屬性指定著色器速率時。

  • 如果使用幾何著色器,可以透過該速率指定底紋速率。
  • 如果未使用幾何著色器,陰影速率是由引發頂點所指定。

結合器清單

支援下列結合器。 使用結合器 (C) 和兩個輸入 (A 和 B)。

  • 傳遞。 C.xy = A.xy。
  • 覆寫。 C.xy = B.xy。
  • 更高的品質。 C.xy = min(A.xy,B.xy)。
  • 低品質。 C.xy = max(A.xy,B.xy)。
  • 將成本 B 套用至 A。C.xy = min(maxRate,A.xy + B.xy)。

其中 maxRate 是裝置上粗圖元的最大允許維度。 這會是

  • 如果 AdditionalShadingRatesSupported 為 falseD3D12_AXIS_SHADING_RATE_2X (也就是 1 的值)。
  • 如果 AdditionalShadingRatesSupported trueD3D12_AXIS_SHADING_RATE_4X (也就是 2 的值)。

透過 ID3D12GraphicsCommandList5::RSSetShadingRate,在命令清單中設定組合器選擇變數速率底紋。

如果未設定任何結合器,則會保留預設值,也就是PASSTHROUGH。

如果組合器的來源是 D3D12_AXIS_SHADING_RATE,則支持數據表中不允許,則輸入會清理為 支援的底紋速率。

如果結合器輸出未對應到平臺上支援的底紋速率,則結果會清理為 支援的底紋速率。

默認狀態和狀態清除

所有底紋速率來源,也就是

  • 管線狀態指定的速率(在命令清單中指定),
  • 螢幕空間影像指定的速率,以及
  • 每個基本屬性

預設為 D3D12_SHADING_RATE_1X1。 默認結合器為 {PASSTHROUGH, PASSTHROUGH}。

如果未指定螢幕空間影像,則會從該來源推斷 1x1 的底紋速率。

如果未指定每個基本屬性,則會從該來源推斷 1x1 的底紋速率。

ID3D12CommandList::ClearState 會將管線狀態指定的速率重設為預設值,並將螢幕空間影像的選取範圍重設為預設值「無螢幕空間影像」。

使用 SV_ShadingRate 查詢底紋速率

了解硬體在任何指定的圖元著色器調用中選取的底紋速率很有用。 這可能會在您的 PS 程式代碼中啟用各種優化。 僅限 PS 的系統變數 SV_ShadingRate提供底紋速率的相關信息。

類型

此語意的類型為 uint。

數據解譯

數據會解譯為 D3D12_SHADING_RATE 列舉的值。

如果未使用 VRS

如果未使用粗圖元底紋,則會將 SV_ShadingRate 讀回 1x1 的值,表示精細圖元。

以範例為基礎的執行下的行為

如果圖元著色器輸入 SV_ShadingRate,而且也會使用以樣本為基礎的執行,例如,輸入 SV_SampleIndex,或使用範例插補關鍵詞,圖元著色器就會失敗。

延遲底紋的備註

延遲陰影應用程式的光源傳遞可能需要知道螢幕哪個區域的底紋速率。 如此一來,照明傳遞分派就可以以較粗的速率啟動。 如果 SV_ShadingRate 變數寫出給 gbuffer,則可以用來完成此作業。

深度和樣板

使用粗圖元底紋時,一律會計算併發出完整樣本解析度的深度和樣板和涵蓋範圍。

使用要求的底紋速率

針對所有階層,預期如果要求底紋速率,而且支持裝置和 MSAA 層級組合,則這是硬體提供的底紋速率。

要求的底紋速率表示計算為結合子輸出的底紋速率(請參閱本主題中的 結合底紋速率因數 一節)。

在樣本計數小於或等於 4 的轉譯作業中,支援的底紋速率為 1x1、1x2、2x1 或 2x2。 如果 AdditionalShadingRatesSupported 功能是 true,則本主題中的 使用可變速率底紋 (VRS) 一節中也支援 2x4、4x2 和 4x4 的底紋速率。

屏幕空間衍生專案

圖元對相鄰圖元漸層的計算會受到粗圖元底紋的影響。 例如,使用 2x2 粗圖元時,相較於不使用粗圖元時,漸層會是大小兩倍。 您的應用程式可能會想要根據您所需的功能來調整著色器來補償此情況, 或否。

由於 mips 是根據螢幕空間衍生項目選擇的,因此粗圖元底紋的使用會影響 Mip 選取。 相較於不使用粗圖元時,使用粗圖元底紋會導致選取較不詳細的誤判。

屬性插補

圖元著色器的輸入可能會根據其來源頂點進行插補。 因為可變速率底紋會影響每個圖元著色器調用所寫入的目標區域,所以它會與屬性插補互動。 這三種類型的插補是中心、心心和樣本。

中心

粗圖元的中心插補位置是完整粗圖元區域的幾何中心。 SV_Position 一律會在粗像素區域的中央插補。

質心

當粗圖元底紋與 MSAA 搭配使用時,對於每個精細圖元,仍然會寫入為目標 MSAA 層級配置的完整樣本數目。 因此,距心插補點位置會考慮粗圖元內的所有樣本。 也就是說,心心插補位置定義為第一個涵蓋樣本,以增加樣本索引的順序。 範例的有效涵蓋範圍是 AND-ed 與轉譯器狀態 SampleMask 的對應位。

注意

在第 1 層上使用粗圖元底紋時,SampleMask 一律為完整遮罩。 如果 SampleMask 設定為不是完整遮罩,則第 1 層會停用粗圖元底紋。

以範例為基礎的執行

以樣本為基礎的執行,或 超取樣,這是使用樣本插補功能所造成,可以搭配粗略的圖元底紋使用,並導致每個樣本叫用圖元著色器。 針對樣本計數 N 的目標,圖元著色器會為每個精細圖元叫用 N 次。

EvaluateAttributeSnapped

提取模型內部函數與第1層上的粗圖元底紋不相容。 如果嘗試在第 1 層上使用具有粗圖元底紋的提取模型內建,則會自動停用粗圖元底紋。

內部 EvaluateAttributeSnapped 可以搭配第 2 層粗圖元底紋使用。 其語法與一直相同。

numeric EvaluateAttributeSnapped(	
    in attrib numeric value, 
    in int2 offset);

針對內容,EvaluateAttributeSnapped 具有兩個字段的位移參數。 在沒有粗圖元底紋的情況下使用時,只會使用完整 32 位中的低階四位。 這四個位代表範圍 [-8, 7]。 此範圍橫跨圖元內的 16x16 網格線。 範圍會包含圖元的上邊緣和左邊緣,而下邊緣和右邊緣則不包含。 位移 (-8, -8) 位於左上角,位移 (7, 7) 由右下角。 位移 (0, 0) 是像素的中心。

搭配粗圖元底紋使用時,EvaluateAttributeSnapped的位移參數能夠指定更廣泛的位置。 offset 參數會為每個精細像素選取 16x16 方格,而且有多個精細圖元。 可表達的範圍和後續使用的位數目取決於粗圖元大小。 粗圖元的上邊緣和左邊緣會包含,而下邊緣和右邊緣則不包含。

下表描述每個粗圖元大小的 EvaluateAttributeSnapped位移參數解譯。

EvaluateAttributeSnapped 的位移範圍

粗略圖元大小 可編製索引的範圍 可表示的範圍大小 所需的位數 {x, y} 可用位的二進位遮罩
1x1 (罰款) {[-8, 7], [-8, 7]} {16, 16} {4, 4} {000000000000xxxx, 000000000000xxxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {000000000000xxxx, 00000000000xxxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {00000000000xxxxx, 000000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {00000000000xxxxx, 00000000000xxxxx}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {00000000000xxxxx, 0000000000xxxxxx}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {0000000000xxxxxx, 00000000000xxxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {0000000000xxxxxx, 0000000000xxx}

下表是從固定點轉換成小數點和小數表示法的指南。 二進位掩碼中的第一個可用位是符號位,而二進位遮罩的其餘部分則包含數值部分。

傳入至 EvaluateAttributeSnapped 之四位值的數位配置並不專屬於可變速率底紋。 為了完整性,這裡重申了這一點。

針對四位值。

二進位值 十進位 分數
1000 -0.5f -8 / 16
1001 -0.4375f -7 / 16
1010 -0.375f -6 / 16
1011 -0.3125f -5 / 16
1100 -0.25f -4 / 16
1101 -0.1875f -3 / 16
1110 -0.125f -2 / 16
1111 -0.0625f -1 /16
0000 0.0f 0 / 16
0001 -0.0625f 1 / 16
0010 -0.125f 2 / 16
0011 -0.1875f 3 / 16
0100 -0.25f 4 / 16
0101 -0.3125f 5 / 16
0110 -0.375f 6 / 16
0111 -0.4375f 7 / 16

針對五位值。

二進位值 十進位 分數
10000 -1 -16 / 16
10001 -0.9375 -15 / 16
10010 -0.875 -14 / 16
10011 -0.8125 -13 / 16
10100 -0.75 -12 / 16
10101 -0.6875 -11 / 16
10110 -0.625 -10 / 16
10111 -0.5625 -9 / 16
11000 -0.5 -8 / 16
11001 -0.4375 -7 / 16
11010 -0.375 -6 / 16
11011 -0.3125 -5 / 16
11100 -0.25 -4 / 16
11101 -0.1875 -3 / 16
11110 -0.125 -2 / 16
11111 -0.0625 -1 / 16
00000 0 0 / 16
00001 0.0625 1 / 16
00010 0.125 2 / 16
00011 0.1875 3 / 16
00100 0.25 4 / 16
00101 0.3125 5 / 16
00110 0.375 6 / 16
00111 0.4375 7 / 16
01000 0.5 8 / 16
01001 0.5625 9 / 16
01010 0.625 10 / 16
01011 0.6875 11 / 16
01100 0.75 12 / 16
01101 0.8125 13 / 16
01110 0.875 14 / 16
01111 0.9375 15 / 16

針對六位值。

二進位值 十進位 分數
100000 -2 -32 / 16
100001 -1.9375 -31 / 16
100010 -1.875 -30 / 16
100011 -1.8125 -29 / 16
100100 -1.75 -28 / 16
100101 -1.6875 -27 / 16
100110 -1.625 -26 / 16
100111 -1.5625 -25 / 16
101000 -1.5 -24 / 16
101001 -1.4375 -23 / 16
101010 -1.375 -22 / 16
101011 -1.3125 -21 / 16
101100 -1.25 -20 / 16
101101 -1.1875 -19 / 16
101110 -1.125 -18 / 16
101111 -1.0625 -17 / 16
110000 -1 -16 / 16
110001 -0.9375 -15 / 16
110010 -0.875 -14 / 16
110011 -0.8125 -13 / 16
110100 -0.75 -12 / 16
110101 -0.6875 -11 / 16
110110 -0.625 -10 / 16
110111 -0.5625 -9 / 16
111000 -0.5 -8 / 16
111001 -0.4375 -7 / 16
111010 -0.375 -6 / 16
111011 -0.3125 -5 / 16
111100 -0.25 -4 / 16
111101 -0.1875 -3 / 16
111110 -0.125 -2 / 16
111111 -0.0625 -1 / 16
000000 0 0 / 16
000001 0.0625 1 / 16
000010 0.125 2 / 16
000011 0.1875 3 / 16
000100 0.25 4 / 16
000101 0.3125 5 / 16
000110 0.375 6 / 16
000111 0.4375 7 / 16
001000 0.5 8 / 16
001001 0.5625 9 / 16
001010 0.625 10 / 16
001011 0.6875 11 / 16
001100 0.75 12 / 16
001101 0.8125 13 / 16
001110 0.875 14 / 16
001111 0.9375 15 / 16
010000 1 16 / 16
010001 1.0625 17 / 16
010010 1.125 18 / 16
010011 1.1875 19 / 16
010100 1.25 20 / 16
010101 1.3125 21 / 16
010110 1.375 22 / 16
010111 1.4375 23 / 16
011000 1.5 24 / 16
011001 1.5625 25 / 16
011010 1.625 26 / 16
011011 1.6875 27 / 16
011100 1.75 28 / 16
011101 1.8125 29 / 16
011110 1.875 30 / 16
011111 1.9375 31 / 16

使用粗圖元底紋時,EvaluateAttributeSnapped可評估位置的網格線會置中於粗圖元中心。

SetSamplePositions

當 API ID3D12GraphicsCommandList1::SetSamplePositions 搭配粗細底紋使用時,API 會設定精細圖元的範例位置。

SV_Coverage

如果 SV_Coverage 在第 1 層上宣告為著色器輸入或輸出,則會停用粗圖元底紋。

您可以使用 SV_Coverage 語意搭配第 2 層粗圖元底紋,並反映要寫入 MSAA 目標的樣本。

使用粗圖元底紋時,允許多個來源圖元組成磚時,涵蓋範圍遮罩代表來自該磚的所有樣本。

鑒於粗圖元底紋與 MSAA 的相容性,指定所需的涵蓋範圍位數目可能會有所不同。 例如,使用 D3D12_SHADING_RATE_2x2的 4x MSAA 資源,每個粗略像素都會寫入四個精細圖元,而每個精細圖元都有四個樣本。 這表示每個粗像素都會寫入總計 4 * 4 = 16 個樣本。

所需的涵蓋範圍位數

下表指出每個粗圖元大小和 MSAA 層級組合都需要多少涵蓋範圍位。

資料表顯示粗略圖元大小、精細圖元數目和 M S A 層級。

如表格所示,使用透過 Direct3D 12 公開的可變速率底紋功能,一次無法使用粗略圖元寫入超過 16 個樣本。 這項限制是由於 Direct3D 12 的限制,其有關允許哪些 MSAA 層級具有粗圖元大小的限制(請參閱本主題中 與可變速率底紋 (VRS) 一節中的表格)。

涵蓋範圍遮罩中的位排序和格式

涵蓋範圍遮罩的位會遵循定義完善的順序。 遮罩包含從左到右的像素,然後由上到下(數據行主要)順序的涵蓋範圍組成。 涵蓋範圍位是涵蓋範圍語意的低序位,而且會密集地封裝在一起。

下表顯示支援粗圖元大小和 MSAA 層級組合的涵蓋範圍遮罩格式。

表格顯示粗圖元大小、粗圖表,以及 1 x M S A 涵蓋區位。1x 涵蓋範圍

下表描繪了 2x MSAA 圖元,其中每個圖元都有兩個索引 0 和 1 的樣本。

像素上樣本標籤的位置是為了說明目的,而且不一定傳達該像素上樣本的空間 {X, Y} 位置;特別是假設範例位置可以程序設計方式變更。 範例會依其以 0 為基礎的索引來參考。

表格顯示粗圖元大小、粗圖表,以及 2 x M S A 涵蓋範圍位。 的涵蓋範圍

下表顯示 4x MSAA 圖元,其中每個圖元都有 4 個索引 0、1、2 和 3 的樣本。

表格顯示粗略圖元大小、粗圖表,以及 4 x M S A 涵蓋範圍位。4x 涵蓋範圍

丟棄

當 HLSL 語意 discard 搭配粗圖元底紋使用時,會捨棄粗略圖元。

目標獨立點陣化 (TIR)

使用粗圖元底紋時,不支援 TIR。

點陣順序檢視 (ROV)

ROV 交鎖會指定為以精細圖元粒度運作。 如果每個樣本執行底紋,則聯結會以取樣數據粒度運作。

保守點陣化

您可以使用保守的點陣化搭配可變速率底紋。 當保守點陣化搭配粗圖元底紋使用時,粗圖元內的精細圖元會透過提供完整覆蓋來保守地點陣化。

覆蓋

使用保守點陣化時,涵蓋範圍語意會包含涵蓋的精細圖元的完整遮罩,而未涵蓋的精細圖元則為 0。

您可以在套件組合上呼叫可變速率底紋 API。

轉譯階段

您可以在 轉譯傳遞中呼叫可變速率底紋 API

呼叫 VRS API

下一節說明應用程式可透過 Direct3D 12 存取可變速率底紋的方式。

功能查詢

若要查詢配接器的可變速率底紋功能,請使用 D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6呼叫 ID3D12Device::CheckFeatureSupport,並提供 D3D12_FEATURE_DATA_D3D12_OPTIONS6 結構,讓函式為您填入。 D3D12_FEATURE_DATA_D3D12_OPTIONS6 結構包含數個成員,包括一個是列舉型別 D3D12_VARIABLE_SHADING_RATE_TIER 的成員(D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier),另一個表示是否支援背景處理(D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported)。

例如,若要查詢第 1 層功能,您可以這麼做。

D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return 
    SUCCEEDED(m_device->CheckFeatureSupport(
        D3D12_FEATURE_D3D12_OPTIONS6, 
        &options, 
        sizeof(options))) && 
    options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;

底紋速率

會組織 D3D12_SHADING_RATE 列舉 中的值,以便輕鬆地將底紋速率分解成兩個座標軸,其中每個座標軸的值會根據 D3D12_AXIS_SHADING_RATE 列舉,在對數空間中以精簡表示。

您可以撰寫巨集,將兩個軸底紋速率組成如下的底紋速率。

#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
    D3D12_AXIS_SHADING_RATE_2X, 
    D3D12_AXIS_SHADING_RATE_1X)

平臺也提供這些巨集,定義於 d3d12.h中。

#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )

這些可用來剖析和瞭解 SV_ShaderRate

注意

此數據解譯適用於描述螢幕空間影像,可由著色器作。 上述各節會進一步討論這一點。 但是,沒有理由不一致定義要隨處使用的粗圖元大小,包括設定命令層級底紋速率時。

設定命令層級底紋速率和結合器

底紋速率和選擇性地透過 ID3D12GraphicsCommandList5::RSSetShadingRate 方法來指定組合器。 您可以傳遞基底底紋速率的 D3D12_SHADING_RATE 值,以及 D3D12_SHADING_RATE_COMBINER 值的選擇性數位。

準備螢幕空間影像

指定可用底紋速率影像的唯讀資源狀態會定義為 D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE

設定螢幕空間影像

您可以透過 ID3D12GraphicsCommandList5::RSSetShadingRateImage 方法來指定螢幕空間影像。

m_commandList->RSSetShadingRateImage(screenSpaceImage);

查詢磚大小

您可以從 D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize 成員查詢磚大小。 請參閱上述 功能查詢

擷取一個維度,因為水準和垂直維度一律相同。 如果系統的功能是 D3D12_SHADING_RATE_TIER_NOT_SUPPORTED,則傳回的磚大小為 0。