> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 可變速率著色與稀疏光照

> 可變速率著色與稀疏光照

本主題說明可變速率著色 (VRS) 與稀疏光照。VRS 是新的 Direct3D 12 硬體與軟體功能，可在轉譯影像的不同區域以不同速率配置轉譯效能/功率。此功能可提升效能。在視覺上，降低著色速率對可察覺的輸出品質幾乎沒有影響。

適用於 XBOX Series X|S 的 2019 年 11 月 Microsoft Game Development Kit (GDK) 包含在 XBOX Series X|S 硬體上對 VRS Tier 2 的支援。

<Note>
  此資訊截至 2019 年 11 月為最新。部分功能可能自那時起已變更或更新。
</Note>

<a id="introduction" />

## 簡介：VRS

1080p 及更高解析度的輸出，促成了可降低像素著色負載的轉譯技術的發展。這些技術包括下列各項：

* 虛擬實境中的注視點轉譯
* 棋盤格轉譯
* 時間升頻

VRS 是此演進過程中合乎邏輯的下一步。適用於 PC 的 VRS 已於 2019 年 3 月推出。目前可在 DirectX 12 和 Windows 10 上透過 Intel Ice Lake (Tier 1) 和 NVIDIA Turing (Tier 2) 技術使用。AMD 將於 2020 年假期期間推出以新 RDNA2 微架構打造的改良版 PC 顯示卡。

如需 VRS 的詳細資訊，請參閱下列資源：

**Microsoft Game Dev**

* [Variable Rate Shading Update XBOX Series Consoles](https://www.youtube.com/watch?v=pPyN9r5QNbs)
* [Tier 2 Variable Rate Shading in Gears](https://www.youtube.com/watch?v=-exWLpgnOJ4)

**Game Developers Conference (GDC) 2019**

* Microsoft：[Boost Rendering Performance with Variable Rate Shading](https://www.youtube.com/watch?v=f-SklVb2MDI)
* Microsoft：[DirectX: Variable Rate Shading, A Deep Dive](https://www.youtube.com/watch?v=2vKnKba0wxk)
* NVIDIA：[Adaptive Shading Overview](https://www.gdcvault.com/browse/gdc-19/play/1026205)

**Siggraph 2019**

* Intel：[Using Variable Rate Shading to improve the user experience](https://www.intel.com/content/www/us/en/developer/videos/use-variable-rate-shading-vrs-to-improve-the-user-experience-in-real-time-game-engines.html)

**出版品**

* [Visually Lossless Content and Motion Adaptive Shading in Games](http://www.leiy.cc/publications/nas/nas-pacmcgit.pdf)

**範例**

* [PC GitHub：Direct3D 12 可變速率著色範例](https://github.com/microsoft/DirectX-Graphics-Samples/tree/develop/Samples/Desktop/D3D12VariableRateShading)

### VRS 設計目標

1. 可在局部選取著色速率，以微調遊戲品質與效能之間的平衡：
   * 在需要的地方使用完整品質。
   * 半速率，與棋盤格轉譯的速率相同。
   * 四分之一速率或甚至更低。
2. 深度、樣板和涵蓋範圍一律為全速率，並具有完美的邊緣。
3. VRS 可以輕鬆整合到現有引擎中，無論是否開啟 VRS 都使用相同的著色器。
4. 不需要填補空洞、不需要額外的階段或緩衝區，也不需要猜測。
5. 不會強制呈現電影般的柔和外觀。可以呈現極為銳利的視覺效果。
6. 與時間升頻和多重取樣反鋸齒 (MSAA) 相容。

### 局部延展性

VRS 可以在低頻紋理細節的區域選擇性地降低著色速率。例如：

* 有模糊效果的區域，例如景深、動態模糊和光暈
* 低光源或光線飽和的情況
* 部分遮蔽，例如透明物體、霧、水、雲、樹葉後方或抬頭顯示器 (HUD) 元素
* 低頻紋理細節，例如粒子和半解析度透明物體

通常不會被注意到的區域。例如：

* 螢幕邊緣
* 虛擬實境眼球追蹤安全區域
* 快速移動的物體

**圖 1. 著色速率控制每個像素的像素著色器 (PS) 叫用次數。**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s09.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=a39a4fafb64127b546ad81ac4b84c325" alt="著色速率控制每個像素的像素著色器叫用次數" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s09.png" />

圖 1 顯示四種 VRS 著色速率。

* 1 × 1 速率：每個像素一次 PS 叫用。為每個像素著色。
* 2 × 1 速率：每個像素二分之一次 PS 叫用。垂直方向有更多細節。
* 1 × 2 速率：每個像素二分之一次 PS 叫用。水平方向有更多細節。
* 2 × 2 速率：每個像素四分之一次 PS 叫用。四分之一速率。

使用下列其中一種方法指定著色器速率。

### 著色速率來源

有三種方式可以指定著色器速率。

* 每個繪製呼叫：
  * Windows PC 上的 Tier 1。
  * [RSSetShadingRate](/zh-TW/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist5/methods/id3d12graphicscommandlist5_rssetshadingrate_public) 會設定 VRS 的基本著色速率和合併器。
* 每個引發頂點或基本型別：
  * Windows PC 和 XBOX Series X|S 上的 Tier 2。
  * 使用 [SV\_ShadingRate](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-feature) 匯出。
* 螢幕空間對應：
  * Windows PC 和 XBOX Series X|S 上的 Tier 2。
  * [RSSetShadingRateImage](/zh-TW/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist5/methods/id3d12graphicscommandlist5_rssetshadingrateimage_public) 會設定 VRS 的螢幕空間著色速率影像。
  * 每個圖格一個 `R8_UINT`，其中包含 [D3D12\_SHADING\_RATE](/zh-TW/reference/graphics/d3d12/enums/d3d12_shading_rate_public) 列舉。
  * 應用程式會查詢圖格大小，為 8 × 8、16 × 16 或 32 × 32 其中之一。

**圖 2. 著色速率來源與合併器。**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s11.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=78b09a61b42fb899f54e35173f4e9df8" alt="著色速率來源與合併器" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s11.png" />

圖 2 顯示一個包含三個來源和一組兩個合併器的來源與合併器範例。

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

**圖 3. 合併器 API。**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s12.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=75f403128d82b12e1ff2dfcfd68d7db6" alt="合併器 API" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s12.png" />

圖 3 顯示圖 2 中的合併器 API 呼叫。設定合併器以取得所需的結果。

**圖 4. VRS 結果。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s13.png" alt="VRS 結果" />

圖 4 顯示以可變速率在 4K、8 × 8 圖格大小且未使用時間反鋸齒 (TAA) 的情況下轉譯的場景。此場景在轉譯時大量降低了著色速率。

**圖 5. 每個圖格的著色速率。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s14.png" alt="每個圖格的著色速率" />

圖 5 顯示使用 Sobel 濾波器和每個圖格投票的相同場景。

1 × 1 速率為紅色。2 × 1 速率為青色，具有更多垂直細節，可顯示左右兩側牆面上的紋理細節。1 × 2 速率為黃色，具有更多水平細節。2 × 2 速率為黑色。

**圖 6. 放大區域。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s16.png" alt="放大區域" />

圖 6 以 160 × 168 像素的區域放大圖 5 後方牆面上的石塊。這大約是原始 4K 場景的 0.3%。

* VRS 訊號位於圖 6 的左側。
* 完全以 1 × 1 速率轉譯的「真實基準」影像位於圖 6 的中間。
* 著色速率和絕對誤差影像位於圖 6 的右側。

**圖 7. 放大區域：1 × 1 速率。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s16a.png" alt="放大區域：1 x 1 速率" />

圖 7 顯示產生著色器速率的著色器使用完整 1 × 1 速率的位置。請注意，這是在高對比的區域中進行的。另請注意，著色器挑出了受影響石塊頂端的鏡面反射。

**圖 8. 放大區域：2 × 2 速率。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s16b.png" alt="放大區域：2 x 2 速率" />

圖 8 顯示著色器在石塊表面上使用 2 × 2 速率的位置。請注意 VRS 訊號的著色品質下降。

**圖 9. 放大區域：多種著色速率。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s16c.png" alt="放大區域：多種著色速率" />

圖 9 顯示在石塊表面受損部分使用多種著色速率的區域。

**圖 10. 放大區域：半速率。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s16d.png" alt="放大區域：" />

圖 10 顯示使用半速率著色的區域。這有助於保留特定區域中的細節。若沒有半速率著色，就必須使用全速率著色。

**圖 11. 我們執行了多少著色？**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s17.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=0f3715de6e310f4ff740575fa357325d" alt="我們執行了多少著色？" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s17.png" />

圖 11 顯示螢幕轉譯期間執行的著色量。放大的區段為 20 × 21 個圖格 (160 × 168 像素)。

* 94 個全速率圖格 (紅色)
* 143 個半速率圖格 (青色/黃色)
* 183 個四分之一速率圖格 (黑色)

每個圖格 8 × 8 像素時的 PS 叫用次數：

* 不使用 VRS = 26,880 個 PS 執行緒
* 使用 VRS = 13,520 個 PS 執行緒
* PS 叫用次數除以像素數 = 0.503

### 衍生螢幕空間對應

我們建議您使用上一個畫面來預測目前的畫面。例如，上一個畫面會告訴您：

* 將在何處進行景深。
* 動態模糊發生的位置。
* 有低光源區域或光線飽和區域。

前述範例 (圖 4 到圖 11) 的摘要：

* 從 Sobel 濾波器開始。
* 結果是在不使用動態重新投影的情況下達成的。
* 將 X 和 Y 摺積核心與梯度和亮度進行檢查，然後與某個速率進行比較。
* 針對要使用的著色速率進行每個圖格投票。
* 如果 X 或 Y 的比較結果不為零，則使用 2 × 1 或 1 × 2 速率。
* 我們建議您使用跨通道內建函式。

結果是一個 API 介面小、不需變更著色器、也不需變更 MSAA 的流程。不需要重建階段。VRS 表面已完成，可以進行轉譯。

<Note>
  如需更新的濾波器，請參閱 [Microsoft GDK 主機範例](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics) 中的 VRSandSparseLighting 範例。
</Note>

**圖 12. PS 叫用位置的變更。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s19.png" alt="PS 叫用位置的變更" />

圖 12 比較以 1 × 1 速率轉譯的真實基準影像與相同場景的 VRS 訊號。

VRS 會變更 PS 叫用位置，這可能會產生問題。例如：

* VRS 可能會擷取到真實基準影像中沒有的細節。
* 不同的著色速率可能會擷取或遺漏子像素細節。

子像素細節 (或取樣不足) 可能會是個問題。

* 攝影機移動時的時間鋸齒：
  * 在此範例中，即使不使用 VRS 也會出現時間鋸齒問題。
* VRS 粗略速率可能會讓取樣不足的情況更嚴重。
  * 每個粗略軸的紋理梯度都較長。
  * 較低 mip 的選取是自動的，並已改善鋸齒。
  * 使用網格細節層級 (LOD) 可提升效能。
  * 使用著色器鋸齒時請小心。
  * 使用 TAA 解決取樣不足的轉譯問題。

<a id="vrs-on-pc" />

### 著色速率

1 × 1、2 × 1、1 × 2 和 2 × 2 速率是 VRS 的最低功能集。PC 可透過 [AdditionalShadingRatesSupported](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-feature) 取得額外功能，支援 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

**Civilization VI**

* 整體畫面時間減少 8-17%。

<Note>
  如需 DOOM Eternal 和 Gears 5 的效能提升成果及更新資訊，請參閱下列影片：
</Note>

[Variable Rate Shading Update XBOX Series Consoles](https://www.youtube.com/watch?v=pPyN9r5QNbs)。

<a id="term-anaconda-and-term-lockhart-vrs-tier2x" />

## 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](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-feature) 輸入可正常運作。
* 硬體未實作符合規格的質心。
* 著色速率影像對應上允許使用[轉譯目標檢視](/zh-TW/reference/graphics/d3d12/structs/d3d12_render_pass_render_target_desc_public) (RTV)。

### XBOX Series X|S XBOX 擴充功能

已規劃支援：

* 搭配 MSAA 的超級取樣。
* 取樣位置位移。
* 額外的合併器。
* 搭配多個檢視區的每個基本型別著色速率。
* 從網域著色器匯出著色速率。
* 著色速率意見反應表面。

請透過 Microsoft Game Development Kit (GDK) 論壇告訴我們您的功能優先順序。

### 搭配 MSAA 的超級取樣

XBOX Series X|S 支援 2x 和 4x 超級取樣著色速率。例如，它們會用於 8x MSAA。每個像素可能的 PS 叫用次數如下。

* 0.25
* 0.5
* 1
* 2
* 4
* 8

每個 2 × 2 速率一次 PS 叫用是最粗略的可能速率。使用 8× MSAA 時，實際上是 1/32 速率，也就是一次 PS 叫用廣播到 4 個像素 × 8 個樣本。

**圖 13. XBOX Series X|S 著色速率的完整矩陣。**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s28.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=02eb9665d7add02b6eff85b7dd3b09fc" alt="XBOX Series X|S 著色速率的完整矩陣" width="1280" height="721" data-path="images/gdk/features/graphics/xf19-gr08-s28.png" />

圖 13 顯示考量超級取樣網域的 XBOX Series X|S 著色速率矩陣。此矩陣顯示每個像素的 PS 叫用次數。請注意，超級取樣網域中沒有矩形模式。

### HTile 和螢幕空間對應

在 XBOX Series X|S 中，著色速率會寫入螢幕空間對應，然後轉碼為 [HTile](/zh-TW/reference/graphics/d3d12_xs/enums/d3d12xbox_shading_rate_settings_htile_mode_type)，再由點陣化器從中讀取著色速率。

* 圖格大小一律為 8 × 8。不需要查詢。
* 圖格會在點陣化期間讀取。不需要額外的頻寬。
* XBOX 擴充功能可以在單一階段中執行深度清除並設定著色速率對應。這可提升效能。

#### 兩種新的 HTile 編碼

現在提供兩種具有 Stencil 的新 HTile 編碼。

* 不支援超級取樣著色速率時：
  * HTile Stencil 中的備用位元 10-11 用於儲存著色速率。
* 支援超級取樣著色速率時：
  * 著色速率需要四個位元。HTile 會失去其第二個 Hi-Stencil 預先測試 (位元 6-7)。第一個預先測試仍會保留。

在 2019 年 11 月的 Microsoft Game Development Kit (GDK) 中，所有 HTile 都是第二種編碼。未來預期會提供「永不使用 VRS」資源旗標，傳回「無樣板」HTile 格式以獲得額外精確度。Microsoft Game Development Kit (GDK) 將會新增對第一種 HTile 格式的支援。

### 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 有額外的合併器。**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s32.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=ff631fff6f8d37a757d067c2315e0c20" alt="XBOX Series X|S 有額外的合併器" width="1280" height="721" data-path="images/gdk/features/graphics/xf19-gr08-s32.png" />

圖 14 顯示 XBOX Series X|S 中的其他合併器。如果有需求，我們可以公開這些合併器。

### PS 叫用位置

XBOX Series X|S 硬體支援中心、質心和可程式化的取樣位移，可以變更像素著色器的叫用位置。

* 每個著色速率 4 位元的位移
* PS 叫用的位置可以在每個畫面週期中變更

### VRS 不相容性

有一些項目與 VRS 不相容，並會在 XBOX Series X|S 中將其關閉。當 PS 位置未與深度樣本或樣板樣本對齊時，就會發生這種情況。

* 深度後涵蓋範圍遮罩
* [點陣順序檢視](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-feature) (ROV)
* [SV\_Depth](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-feature) 匯入
  * 改為透過插值器傳遞。請參閱會為您執行此動作的 `__XBOX_SV_POS_ZW_VIA_ATTRIBUTE` 著色器編譯器定義。
* 寫入 `SV_Depth` 或 [SV\_StencilRef](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-feature)

### 著色速率意見反應表面擴充功能

著色速率意見反應表面擴充功能會執行下列動作：

* 從 [cmask](/zh-TW/build/core-features/graphics/overviews/cmask-decoding) 取用 2 個位元
* 記錄三角形在每個軸上是以精細速率還是粗略速率轉譯
* 從 `cmask` 移除快速清除功能
* 與用於快速合成的 `cmask` 流程不相容

### 平台支援總覽

**圖 15. 平台支援。**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s36.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=99dcf851de13981e357bc1dd13e6f461" alt="平台支援" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s36.png" />

圖 15 顯示每個平台的功能支援。

<Note>
  此資訊截至 2019 年 11 月為最新。部分功能可能自那時起已變更或更新。
</Note>

請注意下列事項：

* XBOX Series X|S 支援最多的功能集。
* 對於小型特徵，最好使用 8 × 8 圖格而非 16 × 16 圖格，因為這樣會針對較少的像素提升著色速率。

<a id="term-scarlett-hardware-performance-optimizations" />

## XBOX Series X|S 硬體效能最佳化

XBOX Series X|S 的效能改進需要搭配降低像素著色器負載來進行。

### 色彩區塊作業

在邏輯圖形管線中，色彩區塊是轉譯輸出前的最後兩個邏輯作業之一。

**慢速路徑**

當 RTV 大於每像素 32 位元 (bpp) 或已啟用混色時：

* 不使用 VRS 時，每個轉譯後端 (RB) 每個時脈週期處理 4 個像素。
* 使用 VRS 時，每個 RB 每個時脈週期處理 4 個像素。不過，從粗略到精細的廣播需要額外 *n* 個週期，其中 *n* 等於涵蓋的像素數。

**快速路徑**

當 RTV 小於或等於 32 bpp 且未啟用混色時：

* 不使用 VRS 時，您可以使用最佳化的轉譯後端 (RB+)，以 2x 速率達到每個 RB 每個時脈週期 8 個像素。
* 使用 VRS 時，1 × 1 速率為每個 RB 每個時脈週期 4 個像素。
* 不過，色彩區塊可以側載額外的廣播複本。
  * 2 × 1 速率為每個時脈週期 4 個像素。
  * 1 × 2 速率為每個時脈週期 8 個像素。
  * 2 × 2 速率為每個時脈週期 8 個像素。

每個 RB 每個時脈週期的上限為 16 個像素。

由於色彩區塊可以處理額外的複本，像素著色器的工作現在已獲得改善。

### 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 速率的壓縮比。

<a id="sparse-lighting-or-sparse-deferred-passes" />

## 稀疏光照

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 群組大小的範例如下。

1. 計算著色器執行緒會比較每 2 × 2 像素的 g-buffer 值。
2. 接著每個執行緒會寫出 1-4 個座標。每個座標各有 32 位元。
   * 4 位元用於相對於圖格的 x 座標。
   * 4 位元用於相對於圖格的 y 座標。
   * 3 位元用於指出是否要在 x、y 或對角線上複製值 (用於填補空洞)。
   * 21 位元足以儲存深度值。
3. 其中一個輸出是每個螢幕圖格所需的光照作業數量計數。

<Note>
  如需更新的資訊，請參閱下列資源：
</Note>

[Variable Rate Compute Shaders - Halving Deferred Lighting Time](https://www.youtube.com/watch?v=Sswuj7BFjGo)。

[VRSandSparseLighting 範例](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics)。

### 延遲光照著色器

延遲光照著色器現在會為每個圖格執行緒分派一個 wave，而不是為每個像素分派一個執行緒。

1. wave 會在 `tileCount` 中迴圈執行 *n* 次。當您移除等於或大於一個 wave 工作量的光照作業時，效能就會提升。比較 Wave32 與 Wave64 的效能時：
   * 當要打光的像素為 224 個或更少時，Wave32 可產生加速效果。
   * 當要打光的像素為 194 個或更少時，Wave64 可產生加速效果。
2. 執行緒會讀取 32 位元，解壓縮 coordinate.xy 和深度。
3. 照常進行光照。光源清單仍為 wave 不變。
4. 最後最多進行三次打光結果的廣播複製。
   * 水平、垂直和對角線複製各使用一個位元。
   * 使用 XOR1 計算三個複本各自的 destination.xy。
   * 空洞填補完美、已預先計算且成本低廉。

**圖 16. 稀疏光照結果與光照作業計數。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s47.png" alt="稀疏光照結果與光照作業計數" />

圖 16 左側顯示稀疏光照的石獅頭部 4K 影像。右側為計數緩衝區。它顯示光照作業大幅減少。石塊的 g-buffer 經過測試，以小幅允許的深度範圍 (LinearZ 允許差異為 0.001) 檢查完全重複的值。

**圖 17. 未填補空洞的光照結果。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s48.png" alt="未填補空洞的光照結果" />

圖 17 顯示未填補空洞的獅子眼球放大影像。

* 空洞為黑色像素。
* 1 × 1 時每個樣本都會打光。
* 2  × 1 和 1 × 2 看起來都像棋盤格。
* 2 × 2 為每四個樣本中為一個打光。

請注意，線框是可見的。此處的問題在於要求的著色速率不一定是實際發生的著色速率。

例如，請考慮以 2 × 2 速率著色的 2 × 2 像素四邊形。這在零重繪的情況下可能產生一到四次 PS 叫用。

* 如果像素四邊形由單一三角形涵蓋，則為一次叫用。
* 如果四邊形由四個三角形涵蓋，則為四次叫用。

不佳的網格 LOD 會產生不佳的 VRS 結果。

**圖 18. 加入 0.025 差異的 G-buffer 比較。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s50.png" alt="加入 0.025 差異的 G-buffer 比較" />

圖 18 顯示在 g-buffer 比較期間於值中加入小幅允許差異的結果。左側為法線值。右側為反照率值。加入小幅差異可減少光照作業的數量並消除線框。這些影像的亮度在某種程度上與光照計算的數量相對應。這接近要打光的最佳像素集合，也就是每個 2 × 2 速率 1、2、3 或 4 個像素。

**圖 19. G-buffer 完全相符。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s51.png" alt="G-buffer 完全相符" />

圖 19 顯示已填補空洞的獅子頭部影像。即使放大，也很難分辨兩者之間的差異。

### 使用 XBOX Series X|S 專屬最佳化的 G-buffer 檢查

<Note>
  有一種不需檢查 g-buffer 內容的改良實作。如需詳細資訊，請參閱下列影片和範例。
</Note>

[Variable Rate Compute Shaders - Halving Deferred Lighting Time](https://youtu.be/Sswuj7BFjGo?t=859)

[VRSandSparseLighting](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics) 範例

G-buffer 檢查的成本很高。XBOX Series X|S 專屬最佳化包括下列各項：

1. 讀取著色速率對應。針對全速率圖格使用快速路徑，並處理每個像素。
2. 利用著色速率意見反應 `cmask` 表面。針對由單一三角形涵蓋的降低速率圖格使用快速路徑。
3. 針對其餘圖格：
   1. 讀取 DCC 金鑰，然後利用零差異。
   2. 進行 g-buffer 檢查。
      * 使用 g-buffer 雜湊進行最佳化。這會付出儲存空間和頻寬的成本。
      * 將 g-buffer 讀取與執行其他工作 (例如讀取深度) 的階段結合。

**圖 20. 在 4K 下稀疏光照與一般延遲光照的節省比較。**

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/graphics/xf19-gr08-s53.png" alt="在 4K 下稀疏光照與一般延遲光照的節省比較" />

圖 20 顯示在 4K 下比較稀疏光照節省與延遲光照的場景轉譯。

* 這些場景中未使用 `cmask` 和 DCC。
* 圖中不包含 VRS 或點陣化時間所節省的部分。
* 柱子周圍的深度不連續會造成大型深度分割，以及較高的光源計數。
* 在底部場景中，光源計數相對較低。
* 頂部場景的總經過時間最長。底部場景的總經過時間最短。改進幅度會隨著場景複雜度而有利地擴展。

<a id="integration-with-other-techniques" />

## 與其他技術整合

### VRS、動態解析度縮放和時間升頻

VRS 不能取代動態解析度縮放 (DRS)。

* 當畫面時間超過目標畫面時間時，可以降低著色速率。
* VRS 的改進無法預測。它們取決於場景內容。其他因素包括光照。
* DRS 對畫面時間的影響更大，也更可預測。

VRS 的改進是額外的好處。

* 不要取代 DRS。而是協助 DRS 達到更高的解析度。
* 使用時間升頻來輸出解析度。

**圖 21. XBOX Series X|S 上的 VRS 與棋盤格轉譯比較。**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s56.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=877965ce7f3224ac103e4b17c9331cd2" alt="XBOX Series X|S 上的 VRS 與棋盤格轉譯比較" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s56.png" />

圖 21 比較 XBOX Series X|S 上的 VRS 與棋盤格轉譯技術。

### VRS 效能因素

VRS 效能取決於數個因素。其中包括：

* 點陣化效率。建議使用視差、浮雕和錐形步進對應。
* 場景內容。
* 計算著色速率的額外負荷。
* PS 的成本和下游硬體瓶頸。
* 您個人對效能與品質的偏好。

### 每個三角形/每個繪製呼叫的著色速率

每個三角形/每個繪製呼叫的著色速率可大幅提升效能。與螢幕空間對應相比，它們可降低 GPU 成本。

**每個繪製呼叫：**

* 粒子和快速移動的物體會轉譯至反射對應。
* 判斷物體是否位於半透明物體後方。

**每個三角形：**

* 判斷三角形相對於攝影機是否位於水面的另一側。
* 判斷三角形是否被樹葉或其他物體遮蔽。

<a id="future-plans" />

## 未來計畫

### 僅限 XBOX

* 移除螢幕空間對應。
  * 將著色速率直接寫入 HTile。
  * 在相同的作業中執行深度清除。
* 每個畫面輪換取樣位移。
  * 這會產生類似棋盤格的收斂，但能提供完美的涵蓋範圍。

### PC 和 XBOX

* 將著色速率判斷與後製處理著色器結合。
* 對於低於 1 × 1 但尚未達到 2 × 2 的速率，請執行下列動作：
  * 考慮每個畫面交替使用 2 × 1 和 1 × 2 速率，特別是 60 赫茲的遊戲。
  * 這會產生棋盤格圖樣，其中黑色方格在第一個畫面取得 2 × 1，在下一個畫面取得 1 × 2。白色方格在第一個畫面取得 1 × 2，在下一個畫面取得 2 × 1。
  * 使用粗略 TAA 抖動，而非子像素 TAA 抖動。
  * 新增每個三角形的著色速率。
    * 除非指定了更粗略的速率，否則請使用螢幕空間對應。這是很好的預設合併器設定。
* 光線追蹤。
  * 使用相同的著色頻率量測 (對應) 來控制光線數量。
  * 將光線結果廣播至相鄰像素 (稀疏光線追蹤)。

<a id="conclusion" />

## 結論

VRS 是適用於 PC 和 XBOX Series X|S 裝置的強大最佳化。

* VRS 提供完美的涵蓋範圍和局部著色速率控制。這些是相較於現有功能的重大改進。
* 將 VRS 加入引擎非常容易。VRS 能與 DRS 和時間升頻等現有技術良好整合。
* 在處理傳統上成本高昂的效果 (例如模糊、陰影和體積效果) 時，VRS 的效益最大。
* VRS 的額外負荷非常低。

使用稀疏光照來利用 VRS 訊號。

* 為重複的 g-buffer 資料打光會浪費資源。
* 也可以進行其他稀疏階段。
* 重複使用每個螢幕圖格所需的光照作業計數及其座標。

ATG 範例提供用於計算著色速率的獨立著色器​。​如需 VRS 的詳細資訊，請參閱 [Microsoft GDK 主機範例](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics) 中的 VRSandSparseLighting 範例。

<a id="next-steps" />

## 後續步驟

如果您想要檢閱與此概觀相關之簡報資料中的資訊，請從 [XBOX Developer Download Secure Data Storage (SDS)](https://www.microsoft.com/en-us/software-download/gdk) 下載下列檔案。

* 投影片：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

<a id="gdk-graphics-presentations" />

### 下載 Microsoft PowerPoint 簡報和影片

1. 前往 [Game Development Kit (GDK) 下載](https://www.microsoft.com/en-us/software-download/gdk)。
2. 在 <b>Select file type</b> 下，選取 **Conference Materials**，然後選取 **Confirm**。
3. 在 <b>Select build/version number</b> 下，選擇下列其中一個圖形簡報。
   * Xfest 2019 Graphics Track PowerPoints
   * Xfest 2019 Graphics Track Videos
4. 選取 <b>Download Now</b>，然後等候 .zip 檔案下載完成。
5. 前往本機的 \[下載] 資料夾，然後從壓縮資料夾中解壓縮 (擷取) 檔案。

<a id="gdk-graphics-samples" />

### 下載本主題中提及的 GDK 主機範例

1. 前往 [Game Development Kit (GDK) 下載](https://www.microsoft.com/en-us/software-download/gdk)。
2. 在 <b>Select file type</b> 下，選取 **GDK**，然後選取 **Confirm**。
3. 在 <b>Select build/version number</b> 下，選擇最新的 **Microsoft GDKX (Sample only)** 選項。
4. 選取 <b>Download Now</b>，然後等候 .zip 檔案下載完成。
5. 前往本機的 \[下載] 資料夾，然後從壓縮資料夾中解壓縮 (擷取) 檔案。
6. 選取 **GDKSamples** > **Graphics**。搜尋範例。

<a id="see-also" />

## 另請參閱

[DirectX 12 Specs - Variable Rate Shading](https://microsoft.github.io/DirectX-Specs/d3d/VariableRateShading.html)

[Variable Rate Shading](https://github.com/microsoft/DirectX-Specs/blob/master/d3d/VariableRateShading.md)

[可變速率著色概觀](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-overview)

[為何使用可變速率著色？](/zh-TW/build/core-features/graphics/newfeatures/vrs/why-vrs)

[可變速率著色功能設計](/zh-TW/build/core-features/graphics/newfeatures/vrs/vrs-feature)

[AMD FidelityFX Variable Shading](https://gpuopen.com/fidelityfx-variable-shading/)

[Variable Rate Shading Update XBOX Series Consoles](https://www.youtube.com/watch?v=pPyN9r5QNbs)

[Variable Rate Compute Shaders - Halving Deferred Lighting Time](https://www.youtube.com/watch?v=Sswuj7BFjGo)


## Related topics

- [GDK 範例](/zh-TW/home/setup-install/samples.md)
- [Xfest 2019](/zh-CN/build/core-features/graphics/overviews/presentations/xfest2019/index.md)
- [NDA 主題目錄 - Microsoft Learn 線上連結](/zh-TW/nda/nda-topic-directory.md)
- [光照 API 概览](/zh-CN/build/core-features/common/lighting/gc-lighting-toc.md)
- [光照 API 参考](/zh-CN/reference/lighting/gc-reference-lighting-toc.md)
