可變速率底紋 (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個樣本,相較於其他案例,還有額外的硬體對齊障礙可支援。
功能層
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。
其紋理配置 UNKNOWN。 因為不允許交叉配接器,所以無法隱含地成為數據列主要版面配置。
屏幕空間影像數據填入的預期方式是其中之一
- 使用計算著色器寫入數據;屏幕空間影像系結為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 = max(A.xy,B.xy)。
- 將成本 B 套用至 A。C.xy = min(maxRate,A.xy + B.xy)。
其中 maxRate
是裝置上粗圖元的最大允許維度。 這會是
- 如果 AdditionalShadingRatesSupported 為
false
,D3D12_AXIS_SHADING_RATE_2X (也就是 1 的值)。 - 如果 AdditionalShadingRatesSupported
true
D3D12_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 層級組合都需要多少涵蓋範圍位。
如表格所示,使用透過 Direct3D 12 公開的可變速率底紋功能,一次無法使用粗略圖元寫入超過 16 個樣本。 這項限制是由於 Direct3D 12 的限制,其有關允許哪些 MSAA 層級具有粗圖元大小的限制(請參閱本主題中 與可變速率底紋 (VRS) 一節中的表格)。
涵蓋範圍遮罩中的位排序和格式
涵蓋範圍遮罩的位會遵循定義完善的順序。 遮罩包含從左到右的像素,然後由上到下(數據行主要)順序的涵蓋範圍組成。 涵蓋範圍位是涵蓋範圍語意的低序位,而且會密集地封裝在一起。
下表顯示支援粗圖元大小和 MSAA 層級組合的涵蓋範圍遮罩格式。
涵蓋範圍
下表描繪了 2x MSAA 圖元,其中每個圖元都有兩個索引 0 和 1 的樣本。
像素上樣本標籤的位置是為了說明目的,而且不一定傳達該像素上樣本的空間 {X, Y} 位置;特別是假設範例位置可以程序設計方式變更。 範例會依其以 0 為基礎的索引來參考。
的涵蓋範圍
下表顯示 4x MSAA 圖元,其中每個圖元都有 4 個索引 0、1、2 和 3 的樣本。
涵蓋範圍
丟棄
當 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。