> ## 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.

# 為什麼要使用 Mesh Shader？

> 為什麼要使用 Mesh Shader？

## 舊版管線

在過去 20 年中，圖形管線不斷演進，才達到現今大家熟悉的狀態。隨著獨立硬體廠商 (IHV) 專注於核心數量、記憶體容量和頻寬日益擴大的競爭，幾何處理模型中某些固定功能的瓶頸也變得明顯。

**圖 1. 舊版圖形管線。藍色階段為固定功能。綠色階段為可程式化著色器。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_legacy_pipeline.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=d9cba34b670d44348ca3562eb17e0c44" alt="舊版圖形管線" width="800" height="52" data-path="images/gdk/features/graphics/ms_legacy_pipeline.png" />

其中最棘手的瓶頸之一是輸入組合器 (IA)。IA 是位於圖形管線頂端的硬體元件，負責處理索引和擷取頂點資料。IA 單元的數量並未以與其他 GPU 資源相同的速度擴充。少量且固定的 IA 單元會造成受限的啟動速率，通常無法讓 GPU 核心的工作達到飽和。

幾何管線的底端是基本型別組合器 (PA)。此硬體元件會將轉換後的頂點組合成基本型別、執行剔除和裁剪常式，然後將留存的執行個體轉送至點陣化。它有固定的匯出速率，而維持此速率可能相當具挑戰性。在某些情況下，這可能是 IA 所造成的，如果著色器 wave 能更快地啟動進入管線，就能平行提交更多基本型別。更多進行中的平行工作負載，能更好地維持對 PA 的壓力。

舊版圖形管線的另一個限制是，傳統管線中的幾何剔除方法有限。被剔除的幾何會降低有效輸送量，並浪費記憶體頻寬和 ALU 在載入和著色永遠不會顯示的頂點屬性上。理想情況下，我們希望能夠以各種細微度進行剔除，以便在最早的時間點剔除幾何。

## Mesh Shader 管線

Mesh Shader 管線針對的就是舊版圖形管線的這些限制。首先，它從管線中移除了 IA 和鑲嵌器。其目的是將著色器 wave 啟動速率最大化，並將 IA 移至可隨 GPU 擴充的著色器程式碼。這有助於讓 GPU 核心達到飽和，並維持對 PA 的壓力。

此管線也提供在管線中多個點剔除工作負載的能力。Amplification Shader 可用來進行低細微度的剔除，例如針對分組的物件、執行個體或 [meshlet](/zh-TW/build/core-features/graphics/newfeatures/ms/ms-meshlet-render)。Mesh Shader 可以在每個基本型別的細微度進行剔除。這提供了一種及早且經常捨棄可輕易剔除之基本型別的方法，可節省寶貴的運算、記憶體頻寬和 PA 輸送量。

**圖 2. Mesh Shader 管線的各個階段。綠色階段為可程式化。藍色階段為固定功能。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_mesh_shader_pipeline.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=1bdf8c428560eef0a048ae32c01c9759" alt="Mesh Shader 管線的階段圖" width="800" height="100" data-path="images/gdk/features/graphics/ms_mesh_shader_pipeline.png" />

## Mesh Shader

Mesh Shader 的設計目的是為幾何管線提供原本只有計算著色器才有的通用性。這讓開發人員能完全控制每個執行緒的工作負載。將索引和頂點屬性擷取移至著色器程式碼，可消除對固定功能硬體的相依性，將 wave 啟動速率最大化，並讓 IA 能隨 GPU 的其餘部分擴充。

它們能動態指定頂點和基本型別匯出數量，為有效率的晶片上基本型別剔除支援開啟了大門。這可以在 Mesh Shader 內針對任意剔除準則，以每個 meshlet 或每個基本型別的方式完成。這可讓著色器將頂點屬性擷取和著色延遲到管線的結尾，也就是在已執行多層剔除之後。

## Amplification Shader

計算著色器經常用來預先處理資源，接著再透過 ExecuteIndirect 進行使用其結果的繪製呼叫。這是許多形式之每個檢視剔除的常見技術。這有幾個細微的缺點，若有適當的硬體支援即可最佳化。

首先，計算著色器執行個體必須將其資料寫入全域記憶體。這會產生擷取延遲，並使其受到整個 GPU 的記憶體頻寬爭用影響。其次，如果計算產生者和圖形取用者是連續的作業，GPU 必須等待所有計算著色器執行個體結束，才能啟動取用的繪製呼叫。這是由無序存取檢視 (UAV) 資源屏障所造成，該屏障必須強制確保所有對最終 UAV 的計算著色器寫入都已完成，任何著色器才能取用它。

**圖 3. 計算著色器緊接著 ExecuteIndirect「DispatchMesh」繪製的簡化 wave 排程視覺化呈現。由於 UAV 屏障，計算著色器 wave (黃色) 與 Mesh Shader wave (綠色) 的執行之間被管線停滯隔開。編號的識別碼將叫用的計算著色器執行緒群組與其 Mesh Shader 子系群組相關聯。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_schedule_cs.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=5ea9ae53609437c8168f1b97ea9e501c" alt="簡化 wave 排程視覺化呈現的圖表，顯示計算著色器工作負載緊接著使用 DispatchMesh 的 ExecuteIndirect 呼叫。以黃色顯示的計算著色器 wave，因 UAV 資源屏障造成的管線停滯，而與以綠色顯示的對應 Mesh Shader wave 執行隔開。" width="810" height="96" data-path="images/gdk/features/graphics/ms_schedule_cs.png" />

Amplification Shader 階段旨在解決這些問題。產生者和取用者是管線化的，使用晶片上的階段間記憶體，且沒有中間的管線排清。Amplification Shader 和 Mesh Shader wave 的排程是交錯的，可以更充分地讓 GPU 的工作達到飽和。

它也開啟了舊版圖形管線中根本不存在的通用工作負載縮減或放大能力。這可用來實作剔除技術、動態執行個體細節層級 (LOD) 選取或自訂鑲嵌常式等功能。

**圖 4. Amplification Shader 工作負載的 wave 排程視覺化呈現。管線中的停滯已消除。編號的識別碼將叫用的 Amplification Shader 執行緒群組與其 Mesh Shader 子系群組相關聯。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_schedule_driver.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=762afa8cd6264b490a8c4a450e683243" alt="簡化 wave 排程視覺化呈現的圖表，顯示 Amplification Shader 工作負載。以黃色顯示的 Amplification Shader wave 與以綠色顯示的對應 Mesh Shader wave 交錯，消除了管線中的停滯。" width="670" height="95" data-path="images/gdk/features/graphics/ms_schedule_driver.png" />

## 另請參閱

[Mesh Shader 管線概觀](/zh-TW/build/core-features/graphics/newfeatures/ms/ms-overview)

[Mesh Shader API 概觀](/zh-TW/build/core-features/graphics/newfeatures/ms/ms-api-design)

[Mesh Shader 管線使用方式](/zh-TW/build/core-features/graphics/newfeatures/ms/ms-usage)


## Related topics

- [Mesh Shader 管線 API 概觀](/zh-TW/build/core-features/graphics/newfeatures/ms/ms-api-design.md)
- [Meshlet 剔除範例](/zh-TW/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling.md)
- [XBOX Series X|S 上的 Mesh Shader 與 Meshlet](/zh-TW/build/core-features/graphics/newfeatures/ms/index.md)
- [為什麼要使用 Sampler Feedback？](/zh-TW/build/core-features/graphics/newfeatures/sfs/why-sf.md)
- [什麼是獎勵廣告？](/zh-TW/services/playfab/economy-monetization/rewarded-ads/index.md)
