此資訊截至 2019 年 11 月為最新。部分功能可能自那時起已變更或更新。
簡介:VRS
1080p 及更高解析度的輸出,促成了可降低像素著色負載的轉譯技術的發展。這些技術包括下列各項:- 虛擬實境中的注視點轉譯
- 棋盤格轉譯
- 時間升頻
- Microsoft:Boost Rendering Performance with Variable Rate Shading
- Microsoft:DirectX: Variable Rate Shading, A Deep Dive
- NVIDIA:Adaptive Shading Overview
VRS 設計目標
- 可在局部選取著色速率,以微調遊戲品質與效能之間的平衡:
- 在需要的地方使用完整品質。
- 半速率,與棋盤格轉譯的速率相同。
- 四分之一速率或甚至更低。
- 深度、樣板和涵蓋範圍一律為全速率,並具有完美的邊緣。
- VRS 可以輕鬆整合到現有引擎中,無論是否開啟 VRS 都使用相同的著色器。
- 不需要填補空洞、不需要額外的階段或緩衝區,也不需要猜測。
- 不會強制呈現電影般的柔和外觀。可以呈現極為銳利的視覺效果。
- 與時間升頻和多重取樣反鋸齒 (MSAA) 相容。
局部延展性
VRS 可以在低頻紋理細節的區域選擇性地降低著色速率。例如:- 有模糊效果的區域,例如景深、動態模糊和光暈
- 低光源或光線飽和的情況
- 部分遮蔽,例如透明物體、霧、水、雲、樹葉後方或抬頭顯示器 (HUD) 元素
- 低頻紋理細節,例如粒子和半解析度透明物體
- 螢幕邊緣
- 虛擬實境眼球追蹤安全區域
- 快速移動的物體

- 1 × 1 速率:每個像素一次 PS 叫用。為每個像素著色。
- 2 × 1 速率:每個像素二分之一次 PS 叫用。垂直方向有更多細節。
- 1 × 2 速率:每個像素二分之一次 PS 叫用。水平方向有更多細節。
- 2 × 2 速率:每個像素四分之一次 PS 叫用。四分之一速率。
著色速率來源
有三種方式可以指定著色器速率。- 每個繪製呼叫:
- Windows PC 上的 Tier 1。
- RSSetShadingRate 會設定 VRS 的基本著色速率和合併器。
- 每個引發頂點或基本型別:
- Windows PC 和 XBOX Series X|S 上的 Tier 2。
- 使用 SV_ShadingRate 匯出。
- 螢幕空間對應:
- Windows PC 和 XBOX Series X|S 上的 Tier 2。
- RSSetShadingRateImage 會設定 VRS 的螢幕空間著色速率影像。
- 每個圖格一個
R8_UINT,其中包含 D3D12_SHADING_RATE 列舉。 - 應用程式會查詢圖格大小,為 8 × 8、16 × 16 或 32 × 32 其中之一。

- 第一個合併器會取得繪製呼叫著色速率,以及來自每個參數頂點或每個引發頂點的匯出。
- 第二個合併器會取得第一個合併器的結果,並將其與螢幕空間對應合併。
- 最終的著色速率會傳送至點陣化器。

圖 4 顯示以可變速率在 4K、8 × 8 圖格大小且未使用時間反鋸齒 (TAA) 的情況下轉譯的場景。此場景在轉譯時大量降低了著色速率。
圖 5. 每個圖格的著色速率。
圖 5 顯示使用 Sobel 濾波器和每個圖格投票的相同場景。
1 × 1 速率為紅色。2 × 1 速率為青色,具有更多垂直細節,可顯示左右兩側牆面上的紋理細節。1 × 2 速率為黃色,具有更多水平細節。2 × 2 速率為黑色。
圖 6. 放大區域。
圖 6 以 160 × 168 像素的區域放大圖 5 後方牆面上的石塊。這大約是原始 4K 場景的 0.3%。
- VRS 訊號位於圖 6 的左側。
- 完全以 1 × 1 速率轉譯的「真實基準」影像位於圖 6 的中間。
- 著色速率和絕對誤差影像位於圖 6 的右側。
圖 7 顯示產生著色器速率的著色器使用完整 1 × 1 速率的位置。請注意,這是在高對比的區域中進行的。另請注意,著色器挑出了受影響石塊頂端的鏡面反射。
圖 8. 放大區域:2 × 2 速率。
圖 8 顯示著色器在石塊表面上使用 2 × 2 速率的位置。請注意 VRS 訊號的著色品質下降。
圖 9. 放大區域:多種著色速率。
圖 9 顯示在石塊表面受損部分使用多種著色速率的區域。
圖 10. 放大區域:半速率。
圖 10 顯示使用半速率著色的區域。這有助於保留特定區域中的細節。若沒有半速率著色,就必須使用全速率著色。
圖 11. 我們執行了多少著色?

- 94 個全速率圖格 (紅色)
- 143 個半速率圖格 (青色/黃色)
- 183 個四分之一速率圖格 (黑色)
- 不使用 VRS = 26,880 個 PS 執行緒
- 使用 VRS = 13,520 個 PS 執行緒
- PS 叫用次數除以像素數 = 0.503
衍生螢幕空間對應
我們建議您使用上一個畫面來預測目前的畫面。例如,上一個畫面會告訴您:- 將在何處進行景深。
- 動態模糊發生的位置。
- 有低光源區域或光線飽和區域。
- 從 Sobel 濾波器開始。
- 結果是在不使用動態重新投影的情況下達成的。
- 將 X 和 Y 摺積核心與梯度和亮度進行檢查,然後與某個速率進行比較。
- 針對要使用的著色速率進行每個圖格投票。
- 如果 X 或 Y 的比較結果不為零,則使用 2 × 1 或 1 × 2 速率。
- 我們建議您使用跨通道內建函式。
如需更新的濾波器,請參閱 Microsoft GDK 主機範例 中的 VRSandSparseLighting 範例。
圖 12 比較以 1 × 1 速率轉譯的真實基準影像與相同場景的 VRS 訊號。
VRS 會變更 PS 叫用位置,這可能會產生問題。例如:
- VRS 可能會擷取到真實基準影像中沒有的細節。
- 不同的著色速率可能會擷取或遺漏子像素細節。
- 攝影機移動時的時間鋸齒:
- 在此範例中,即使不使用 VRS 也會出現時間鋸齒問題。
- VRS 粗略速率可能會讓取樣不足的情況更嚴重。
- 每個粗略軸的紋理梯度都較長。
- 較低 mip 的選取是自動的,並已改善鋸齒。
- 使用網格細節層級 (LOD) 可提升效能。
- 使用著色器鋸齒時請小心。
- 使用 TAA 解決取樣不足的轉譯問題。
著色速率
1 × 1、2 × 1、1 × 2 和 2 × 2 速率是 VRS 的最低功能集。PC 可透過 AdditionalShadingRatesSupported 取得額外功能,支援 2 × 4、4 × 2 或 4 × 4 著色速率。2x 速率似乎是最有效的。使用 2x 速率時,很難發現品質下降。2 × 1 和 1 × 2 速率尤其如此。4x 速率則更容易看出轉譯上的差異,但也更難使用。使用 4x 速率時,效能優勢會降低。 以下是使用螢幕空間對應時的 NVIDIA Tier 2 效能結果。 Wolfenstein II: The New Colossus- 平衡模式的每秒畫面數 (FPS) 提升 6%。
- 效能模式的 FPS 提升 9-10%。
- 來源:Digital Foundry
- 整體畫面時間減少 8-17%。
如需 DOOM Eternal 和 Gears 5 的效能提升成果及更新資訊,請參閱下列影片:
XBOX Series X|S VRS Tier 2.x
XBOX Series X|S 主機支援
XBOX Series X|S 主機在 2019 年 11 月的 Microsoft Game Development Kit (GDK) 中實作了 PC Tier 2 規格,並具有下列功能和例外狀況。 功能:- 1 × 1、1 × 2、2 × 1 和 2 × 2 著色速率
- 螢幕空間對應
- 沒有 4x 模式功能。
- 如果使用 MSAA,涵蓋範圍遮罩輸出目前不正確。已規劃修正此輸出問題。
- SV_Coverage 輸入可正常運作。
- 硬體未實作符合規格的質心。
- 著色速率影像對應上允許使用轉譯目標檢視 (RTV)。
XBOX Series X|S XBOX 擴充功能
已規劃支援:- 搭配 MSAA 的超級取樣。
- 取樣位置位移。
- 額外的合併器。
- 搭配多個檢視區的每個基本型別著色速率。
- 從網域著色器匯出著色速率。
- 著色速率意見反應表面。
搭配 MSAA 的超級取樣
XBOX Series X|S 支援 2x 和 4x 超級取樣著色速率。例如,它們會用於 8x MSAA。每個像素可能的 PS 叫用次數如下。- 0.25
- 0.5
- 1
- 2
- 4
- 8

HTile 和螢幕空間對應
在 XBOX Series X|S 中,著色速率會寫入螢幕空間對應,然後轉碼為 HTile,再由點陣化器從中讀取著色速率。- 圖格大小一律為 8 × 8。不需要查詢。
- 圖格會在點陣化期間讀取。不需要額外的頻寬。
- XBOX 擴充功能可以在單一階段中執行深度清除並設定著色速率對應。這可提升效能。
兩種新的 HTile 編碼
現在提供兩種具有 Stencil 的新 HTile 編碼。- 不支援超級取樣著色速率時:
- HTile Stencil 中的備用位元 10-11 用於儲存著色速率。
- 支援超級取樣著色速率時:
- 著色速率需要四個位元。HTile 會失去其第二個 Hi-Stencil 預先測試 (位元 6-7)。第一個預先測試仍會保留。
XBOX Series X|S 實作詳細資料
呼叫RSSetShadingRateImage 時,會將內容轉碼為 HTile。如果沒有繫結的 HTile,就會從命令清單的命令配置器配置暫時的 HTile。這可在沒有深度的情況下啟用 VRS。VRS 可用於後製處理等用途。如果因記憶體不足而配置失敗,VRS 就會關閉。
如果您變更深度樣板檢視 (DSV),建議您先呼叫 RSSetShadingRateImage(nullptr)。否則,如果 DSV 具有相同的維度,您可能會再次付出轉碼成本。
大於 4K 的 RTV 會失敗。此問題的修正已規劃於 2020 年 4 月的 Microsoft Game Development Kit (GDK) 中推出。
XBOX Series X|S 有額外的合併器
圖 14. XBOX Series X|S 有額外的合併器。
PS 叫用位置
XBOX Series X|S 硬體支援中心、質心和可程式化的取樣位移,可以變更像素著色器的叫用位置。- 每個著色速率 4 位元的位移
- PS 叫用的位置可以在每個畫面週期中變更
VRS 不相容性
有一些項目與 VRS 不相容,並會在 XBOX Series X|S 中將其關閉。當 PS 位置未與深度樣本或樣板樣本對齊時,就會發生這種情況。- 深度後涵蓋範圍遮罩
- 點陣順序檢視 (ROV)
- SV_Depth 匯入
- 改為透過插值器傳遞。請參閱會為您執行此動作的
__XBOX_SV_POS_ZW_VIA_ATTRIBUTE著色器編譯器定義。
- 改為透過插值器傳遞。請參閱會為您執行此動作的
- 寫入
SV_Depth或 SV_StencilRef
著色速率意見反應表面擴充功能
著色速率意見反應表面擴充功能會執行下列動作:- 從 cmask 取用 2 個位元
- 記錄三角形在每個軸上是以精細速率還是粗略速率轉譯
- 從
cmask移除快速清除功能 - 與用於快速合成的
cmask流程不相容
平台支援總覽
圖 15. 平台支援。
此資訊截至 2019 年 11 月為最新。部分功能可能自那時起已變更或更新。
- XBOX Series X|S 支援最多的功能集。
- 對於小型特徵,最好使用 8 × 8 圖格而非 16 × 16 圖格,因為這樣會針對較少的像素提升著色速率。
XBOX Series X|S 硬體效能最佳化
XBOX Series X|S 的效能改進需要搭配降低像素著色器負載來進行。色彩區塊作業
在邏輯圖形管線中,色彩區塊是轉譯輸出前的最後兩個邏輯作業之一。 慢速路徑 當 RTV 大於每像素 32 位元 (bpp) 或已啟用混色時:- 不使用 VRS 時,每個轉譯後端 (RB) 每個時脈週期處理 4 個像素。
- 使用 VRS 時,每個 RB 每個時脈週期處理 4 個像素。不過,從粗略到精細的廣播需要額外 n 個週期,其中 n 等於涵蓋的像素數。
- 不使用 VRS 時,您可以使用最佳化的轉譯後端 (RB+),以 2x 速率達到每個 RB 每個時脈週期 8 個像素。
- 使用 VRS 時,1 × 1 速率為每個 RB 每個時脈週期 4 個像素。
- 不過,色彩區塊可以側載額外的廣播複本。
- 2 × 1 速率為每個時脈週期 4 個像素。
- 1 × 2 速率為每個時脈週期 8 個像素。
- 2 × 2 速率為每個時脈週期 8 個像素。
RSSetShadingRate
若要使用 RB+,請呼叫RSSetShadingRate(D3D12_SHADING_RATE_1x1, nullptr); 來關閉 VRS。請注意,RSSetShadingRate 不會滾動內容。
VRS 與差異色彩壓縮
差異色彩壓縮 (DCC) 現在具有可感知 VRS 的模式,可降低頻寬。- VRS 產生的訊號在一般 DCC 下壓縮效果不佳。
- 訊號範例:錨點、差異、零差異、差異、零差異。重複。
- DCC 已新增可感知 VRS 的模式。
- 針對 2 × 2 速率最佳化,可達到接近 4:1 的壓縮。
- 大幅改善 2 × 1 和 1 × 2 速率的壓縮比。
稀疏光照
VRS 會寫入重複的 g-buffer 值並為其打光。處理重複的 g-buffer 資料是一種浪費。稀疏光照:利用 VRS 訊號
為了避免浪費效能,請檢查 g-buffer 中的重複值,然後只識別並為一部分像素打光。例如,在 2 × 2 像素四邊形中:- 2 × 2 速率為 1 個像素
- 1 × 2 或 2 × 1 速率為 2 個像素 (棋盤格圖樣)
- 1 × 1 速率為 4 個像素
稀疏光照範例實作
使用 16 × 16 圖格大小和 8 × 8 群組大小的範例如下。- 計算著色器執行緒會比較每 2 × 2 像素的 g-buffer 值。
- 接著每個執行緒會寫出 1-4 個座標。每個座標各有 32 位元。
- 4 位元用於相對於圖格的 x 座標。
- 4 位元用於相對於圖格的 y 座標。
- 3 位元用於指出是否要在 x、y 或對角線上複製值 (用於填補空洞)。
- 21 位元足以儲存深度值。
- 其中一個輸出是每個螢幕圖格所需的光照作業數量計數。
如需更新的資訊,請參閱下列資源:
延遲光照著色器
延遲光照著色器現在會為每個圖格執行緒分派一個 wave,而不是為每個像素分派一個執行緒。- wave 會在
tileCount中迴圈執行 n 次。當您移除等於或大於一個 wave 工作量的光照作業時,效能就會提升。比較 Wave32 與 Wave64 的效能時:- 當要打光的像素為 224 個或更少時,Wave32 可產生加速效果。
- 當要打光的像素為 194 個或更少時,Wave64 可產生加速效果。
- 執行緒會讀取 32 位元,解壓縮 coordinate.xy 和深度。
- 照常進行光照。光源清單仍為 wave 不變。
- 最後最多進行三次打光結果的廣播複製。
- 水平、垂直和對角線複製各使用一個位元。
- 使用 XOR1 計算三個複本各自的 destination.xy。
- 空洞填補完美、已預先計算且成本低廉。
圖 16 左側顯示稀疏光照的石獅頭部 4K 影像。右側為計數緩衝區。它顯示光照作業大幅減少。石塊的 g-buffer 經過測試,以小幅允許的深度範圍 (LinearZ 允許差異為 0.001) 檢查完全重複的值。
圖 17. 未填補空洞的光照結果。
圖 17 顯示未填補空洞的獅子眼球放大影像。
- 空洞為黑色像素。
- 1 × 1 時每個樣本都會打光。
- 2 × 1 和 1 × 2 看起來都像棋盤格。
- 2 × 2 為每四個樣本中為一個打光。
- 如果像素四邊形由單一三角形涵蓋,則為一次叫用。
- 如果四邊形由四個三角形涵蓋,則為四次叫用。
圖 18 顯示在 g-buffer 比較期間於值中加入小幅允許差異的結果。左側為法線值。右側為反照率值。加入小幅差異可減少光照作業的數量並消除線框。這些影像的亮度在某種程度上與光照計算的數量相對應。這接近要打光的最佳像素集合,也就是每個 2 × 2 速率 1、2、3 或 4 個像素。
圖 19. G-buffer 完全相符。
圖 19 顯示已填補空洞的獅子頭部影像。即使放大,也很難分辨兩者之間的差異。
使用 XBOX Series X|S 專屬最佳化的 G-buffer 檢查
有一種不需檢查 g-buffer 內容的改良實作。如需詳細資訊,請參閱下列影片和範例。
- 讀取著色速率對應。針對全速率圖格使用快速路徑,並處理每個像素。
- 利用著色速率意見反應
cmask表面。針對由單一三角形涵蓋的降低速率圖格使用快速路徑。 - 針對其餘圖格:
- 讀取 DCC 金鑰,然後利用零差異。
- 進行 g-buffer 檢查。
- 使用 g-buffer 雜湊進行最佳化。這會付出儲存空間和頻寬的成本。
- 將 g-buffer 讀取與執行其他工作 (例如讀取深度) 的階段結合。
圖 20 顯示在 4K 下比較稀疏光照節省與延遲光照的場景轉譯。
- 這些場景中未使用
cmask和 DCC。 - 圖中不包含 VRS 或點陣化時間所節省的部分。
- 柱子周圍的深度不連續會造成大型深度分割,以及較高的光源計數。
- 在底部場景中,光源計數相對較低。
- 頂部場景的總經過時間最長。底部場景的總經過時間最短。改進幅度會隨著場景複雜度而有利地擴展。
與其他技術整合
VRS、動態解析度縮放和時間升頻
VRS 不能取代動態解析度縮放 (DRS)。- 當畫面時間超過目標畫面時間時,可以降低著色速率。
- VRS 的改進無法預測。它們取決於場景內容。其他因素包括光照。
- DRS 對畫面時間的影響更大,也更可預測。
- 不要取代 DRS。而是協助 DRS 達到更高的解析度。
- 使用時間升頻來輸出解析度。

VRS 效能因素
VRS 效能取決於數個因素。其中包括:- 點陣化效率。建議使用視差、浮雕和錐形步進對應。
- 場景內容。
- 計算著色速率的額外負荷。
- PS 的成本和下游硬體瓶頸。
- 您個人對效能與品質的偏好。
每個三角形/每個繪製呼叫的著色速率
每個三角形/每個繪製呼叫的著色速率可大幅提升效能。與螢幕空間對應相比,它們可降低 GPU 成本。 每個繪製呼叫:- 粒子和快速移動的物體會轉譯至反射對應。
- 判斷物體是否位於半透明物體後方。
- 判斷三角形相對於攝影機是否位於水面的另一側。
- 判斷三角形是否被樹葉或其他物體遮蔽。
未來計畫
僅限 XBOX
- 移除螢幕空間對應。
- 將著色速率直接寫入 HTile。
- 在相同的作業中執行深度清除。
- 每個畫面輪換取樣位移。
- 這會產生類似棋盤格的收斂,但能提供完美的涵蓋範圍。
PC 和 XBOX
- 將著色速率判斷與後製處理著色器結合。
- 對於低於 1 × 1 但尚未達到 2 × 2 的速率,請執行下列動作:
- 考慮每個畫面交替使用 2 × 1 和 1 × 2 速率,特別是 60 赫茲的遊戲。
- 這會產生棋盤格圖樣,其中黑色方格在第一個畫面取得 2 × 1,在下一個畫面取得 1 × 2。白色方格在第一個畫面取得 1 × 2,在下一個畫面取得 2 × 1。
- 使用粗略 TAA 抖動,而非子像素 TAA 抖動。
- 新增每個三角形的著色速率。
- 除非指定了更粗略的速率,否則請使用螢幕空間對應。這是很好的預設合併器設定。
- 光線追蹤。
- 使用相同的著色頻率量測 (對應) 來控制光線數量。
- 將光線結果廣播至相鄰像素 (稀疏光線追蹤)。
結論
VRS 是適用於 PC 和 XBOX Series X|S 裝置的強大最佳化。- VRS 提供完美的涵蓋範圍和局部著色速率控制。這些是相較於現有功能的重大改進。
- 將 VRS 加入引擎非常容易。VRS 能與 DRS 和時間升頻等現有技術良好整合。
- 在處理傳統上成本高昂的效果 (例如模糊、陰影和體積效果) 時,VRS 的效益最大。
- VRS 的額外負荷非常低。
- 為重複的 g-buffer 資料打光會浪費資源。
- 也可以進行其他稀疏階段。
- 重複使用每個螢幕圖格所需的光照作業計數及其座標。
後續步驟
如果您想要檢閱與此概觀相關之簡報資料中的資訊,請從 XBOX Developer Download Secure Data Storage (SDS) 下載下列檔案。- 投影片:Xfest 2019 Graphics Track PowerPoints ([2019.11]-Xfest2019GraphicsTrackPowerPoints.ZIP) 中的 XF2019_Graphics_08_Day2_Variable_Rate_Shading_and_Sparse_Lighting.pptx
- 視訊簡報:Xfest 2019 Graphics Track Videos ([2019.11]-Xfest2019GraphicsTrackVideos.ZIP) 中的 XF2019_Graphics_08_Day2_Variable_Rate_Shading_and_Sparse_Lighting.mp4
下載 Microsoft PowerPoint 簡報和影片
- 前往 Game Development Kit (GDK) 下載。
- 在 Select file type 下,選取 Conference Materials,然後選取 Confirm。
- 在 Select build/version number 下,選擇下列其中一個圖形簡報。
- Xfest 2019 Graphics Track PowerPoints
- Xfest 2019 Graphics Track Videos
- 選取 Download Now,然後等候 .zip 檔案下載完成。
- 前往本機的 [下載] 資料夾,然後從壓縮資料夾中解壓縮 (擷取) 檔案。
下載本主題中提及的 GDK 主機範例
- 前往 Game Development Kit (GDK) 下載。
- 在 Select file type 下,選取 GDK,然後選取 Confirm。
- 在 Select build/version number 下,選擇最新的 Microsoft GDKX (Sample only) 選項。
- 選取 Download Now,然後等候 .zip 檔案下載完成。
- 前往本機的 [下載] 資料夾,然後從壓縮資料夾中解壓縮 (擷取) 檔案。
- 選取 GDKSamples > Graphics。搜尋範例。
