可變速率網底 (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的儲存格,該組合會根據 cap (AdditionalShadingRatesSupported) 有條件地啟用。
- 對於空白的儲存格,不支援該組合。
- 對於半色調著色的儲存格,不支援該組合, 而且 涉及追蹤每個圖元著色器調用超過 16 個樣本。 針對追蹤超過 16 個樣本,相較于其他案例,還有額外的硬體對齊障礙可支援。
功能層
VRS 實作有兩層,以及您可以查詢的兩個功能。 資料表之後會更詳細地描述每一層。
第 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。
其紋理配置 未知。 它隱含不能是資料列主要版面配置,因為不允許跨介面卡。
填入螢幕空間影像資料的預期方式是
- 使用計算著色器寫入資料;螢幕空間影像系結為 UAV,或
- 將資料複製到螢幕空間影像。
建立螢幕空間影像時,允許這些旗標。
- 無
- 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 都會使用結合器來結合。
* 依頂點屬性指定著色器速率時。
- 如果使用幾何著色器,可以透過該速率來指定陰影速率。
- 如果未使用幾何著色器,網底速率是由著色頂點所指定。
組合器清單
支援下列結合器。 使用組合器 (C) 和兩個輸入, (A 和 B) 。
- 傳遞。 C.xy = A.xy。
- 覆寫。 C.xy = B.xy。
- 品質較高。 C.xy = min (A.xy, B.xy) 。
- 品質較低。 C.xy = (A.xy、B.xy) 。
- 將成本 B 套用至 A。C.xy = min (maxRate,A.xy + B.xy) 。
其中 maxRate
是裝置上粗略圖元的最大允許維度。 這會是
-
D3D12_AXIS_SHADING_RATE_2X (,如果 AdditionalShadingRatesSupported 為
false
,則值為 1) 。 -
D3D12_AXIS_SHADING_RATE_4X (,如果 AdditionalShadingRatesSupported 為
true
,則值為 2) 。
透過 ID3D12GraphicsCommandList5::RSSetShadingRate,在命令清單上設定組合器選擇可變速率網底。
如果未設定任何結合器,則它們會保持在預設值,也就是 PASSTHROUGH。
如果組合器的來源是 D3D12_AXIS_SHADING_RATE,則支援資料表中不允許此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
,或使用範例插補關鍵字。
延遲網底的備註
延後陰影應用程式的光源階段可能需要知道螢幕哪個區域的網底速率。 如此一來,光源傳遞分派就可以以較粗略的速率啟動。 如果變數寫出至 gbuffer,則可以
SV_ShadingRate
使用 變數來完成此作業。
深度和樣板
使用粗略圖元網底時,深度和樣板和涵蓋範圍一律會以完整的樣本解析度計算和發出。
使用所要求的網底速率
對於所有層級而言,如果要求陰影速率,而且在裝置和 MSAA 層級組合上受到支援,則這是硬體所提供的陰影速率。
要求的網底速率表示計算為結合器輸出的陰影速率 (請參閱本主題) 合併網底速率因數 一節。
在轉譯作業中,支援的網底速率為 1x1、1x2、2x1 或 2x2,其中樣本計數小於或等於四。 If the AdditionalShadingRatesSupported capability is true
, then 2x4, 4x2, and 4x4 are also supported shading rates for some sample counts (see the table in the With variable-rate shading (VRS) section in this topic).
螢幕空間衍生專案
圖元對相鄰圖元漸層的計算會受到粗略圖元網底的影響。 例如,使用 2x2 粗略圖元時,漸層會比不使用粗略圖元時的大小兩倍。 您的應用程式可能會想要調整著色器來補償這點,或者,視您所需的功能而定。
因為 mips 是根據螢幕空間衍生而選擇的,所以粗略圖元網底的使用會影響 mip 選取。 相較于未使用粗略圖元時,使用粗略圖元網底會導致選取較不詳細的 Mips。
屬性插補
圖元著色器的輸入可能會根據其來源頂點進行插補。 因為可變速率網底會影響每個圖元著色器調用所寫入的目的地區域,所以它會與屬性插補互動。 三種插補類型為中心、距心和樣本。
Center
粗略圖元的中心插補位置是完整粗略圖元區域的幾何中心。
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
具有具有兩個欄位的位移參數。 在沒有粗略圖元網底的情況下使用時,只會使用完整三十二的下階四位。 這四個位代表範圍 [-8, 7]。 此範圍跨越圖元內的 16x16 格線。 範圍使得包含圖元的上邊緣和左邊緣,而下邊緣和右邊緣則不包含。 位移 (-8、-8) 位於左上角,而位移 (7、7) 則位於右下角。 位移 (0,0) 是圖元的中心。
搭配粗略圖元網底使用時, EvaluateAttributeSnapped
's offset 參數能夠指定更廣泛的位置範圍。 offset 參數會為每個精細圖元選取 16x16 方格,而且有多個精細圖元。 使用的可表達範圍和後續位數目取決於粗略圖元大小。 包含粗略圖元的上邊緣和左邊緣,而下邊緣和右邊緣則不包含。
下表描述每個粗略圖元大小的位移參數解譯 EvaluateAttributeSnapped
。
EvaluateAttributeSnapped 的位移範圍
粗略圖元大小 | 可編制索引的範圍 | 可表示的範圍大小 | 需要 {x, y} 的位數 | 可用位的二進位遮罩 |
---|---|---|---|---|
1x1 () | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {00000000000xxxx, 000000000000xxxx} |
1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {00000000000xxxx, 00000000000xxxxx} |
2 x 1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {00000000000xxxxx, 000000000000xxxx} |
2 x 2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {0000000000xxxxx, 00000000000xxxxx} |
2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {0000000000xxxxx, 0000000000xxx} |
4 x 2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {0000000000xxxxxx,0000000000xxxxx} |
4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {000000000xxxxxxxxx, 0000000000xxx} |
下表是從固定點轉換為小數和小數表示的指南。 二進位遮罩中的第一個可用位是符號位,而二進位遮罩的其餘部分則包含數值部分。
傳入的 EvaluateAttributeSnapped
四位值數目配置不是變數速率網底特有的。 這裡會再次強調其完整性。
針對四位值。
二進位值 | Decimal | 小數 |
---|---|---|
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 |
針對五位值。
二進位值 | Decimal | 小數 |
---|---|---|
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 |
針對六位值。
二進位值 | Decimal | 小數 |
---|---|---|
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 層級組合所需的涵蓋範圍位數目。
如表格所示,您無法使用粗略圖元一次使用透過 Direct3D 12 公開的可變速率網底功能,一次寫入超過 16 個樣本。 這項限制是因為 Direct3D 12 的條件約束有關哪些 MSAA 層級允許使用粗略圖元大小 (請參閱本主題) 使用 可變速率網底 (VRS) 一節中的表格。
涵蓋範圍遮罩中的位排序和格式
涵蓋範圍遮罩的位會遵循定義完善的順序。 遮罩包含從左至右的圖元涵蓋範圍,然後由上至下 (資料行主要) 順序。 涵蓋範圍位是涵蓋範圍語意的低序位,而且會密集封裝在一起。
下表顯示支援粗略圖元大小和 MSAA 層級組合的涵蓋範圍遮罩格式。
下表會擷取 2x MSAA 圖元,其中每個圖元都有兩個索引 0 和 1 樣本。
圖元上樣本標籤的位置是為了說明目的,不一定傳達該圖元上樣本的空間 {X, Y} 位置;特別是因為範例位置可以透過程式設計方式變更。 範例是以 0 為基礎的索引所參考。
下表顯示 4x MSAA 圖元,其中每個圖元都有四個索引樣本 0、1、2 和 3。
捨棄
當 HLSL 語意 discard
與粗略圖元網底搭配使用時,會捨棄粗略圖元。
與目標無關的點陣化 ()
使用粗略圖元網底時,不支援一併使用一次。」
點陣順序檢視 (ROV)
ROV Interlock 會指定為以精細圖元細微性運作。 如果每個樣本都執行網底,則相互鎖定會以取樣資料細微性運作。
保守點陣化
您可以使用保守點陣化搭配可變速率網底。 當保守點陣化搭配粗略圖元網底使用時,粗略圖元內的精細圖元會藉由提供完整涵蓋範圍以保守方式點陣化。
涵蓋範圍
使用保守點陣化時,涵蓋範圍語意會包含涵蓋之精細圖元的完整遮罩,而未涵蓋的精細圖元則包含 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。