跳轉到主要內容
在 Direct3D 12 中使用 Mesh Shader 管線,可歸結為下列熟悉的步驟。
  1. 使用 DXC 撰寫並編譯 Mesh Shader 和 (選擇性的) Amplification Shader。
  2. 使用編譯後的著色器位元組程式碼建立 Mesh Shader 管線狀態物件。
  3. 使用命令清單記錄 Mesh Shader 管線狀態物件的分派。
  4. 在命令佇列上執行命令清單。

Mesh Shader 管線狀態物件

Direct3D 12 透過熟悉的圖形管線狀態物件 API 公開 Mesh Shader 管線。建立 Mesh Shader 管線狀態物件時,會使用管線狀態串流 API,如接下來的兩個程式碼範例所示。 ID3D12Device 和 ID3D12GraphicsCommandList API 可用於檢查硬體支援並分派 Mesh Shader 管線工作負載 (第二個程式碼範例)。請注意,在 XBOX Series X|S 上不需要檢查硬體支援。 下列程式碼範例顯示要提供給管線串流建立 API 的 Mesh Shader 管線串流描述。
下列程式碼範例顯示 Mesh Shader 管線狀態的建立和使用方式。

Mesh Shader

Mesh Shader 是使用 DXC 命令列工具或編譯器程式庫,以新的 Mesh Shader「ms」著色器設定檔進行編譯,例如 ms_6_5。第三個程式碼範例提供螢幕空間三角形 Mesh Shader 的範例實作,請以該程式碼範例作為參考來跟著操作。 下列是在命令列上編譯 Mesh Shader 的範例。
著色器 main 函式以中繼資料屬性加以修飾。
  • NumThreads 宣告執行緒群組維度
  • OutputTopology 宣告基本型別類型
唯一的輸入是計算著色器中熟悉的執行緒識別碼。所有其他資料都必須透過常數緩衝區檢視 (CBV)、著色器資源檢視 (SRV) 或無序存取檢視 (UAV) 手動讀取。 幾何輸出是透過 out 參數宣告為_共用輸出陣列_。這些是唯寫陣列參數,其類型宣告了要從著色器匯出的使用者定義頂點和基本型別類型。vertices、indices 和 primitives 修飾詞會將每個參數指定為三種不同幾何輸出之一。這些陣列的長度必須是編譯時期常數,並定義可匯出的頂點和基本型別數量上限。 SetMeshOutputCounts 內建函式會宣告執行緒群組實際的頂點和基本型別匯出數量。此呼叫為選擇性,numVerts 和 numPrims 的預設值皆為零。這些值必須小於或等於輸出陣列的長度。此呼叫可以在寫入共用輸出陣列_之前_的任何時間發生。所提供的值預期在執行緒群組內為常數,且會從第一個通道讀取。 接著,頂點和基本型別會由執行緒群組轉換,並寫入共用輸出陣列。對 SetMeshOutputCounts() 的呼叫必須在任何寫入發生之前執行,且寫入必須在該呼叫所宣告的範圍內。 下列程式碼範例顯示轉譯單一螢幕空間三角形的 Mesh Shader。

Amplification Shader

Amplification Shader 是使用 DXC 命令列工具或程式庫,以新的 Amplification Shader「as」著色器設定檔進行編譯,例如 as_6_5。 下列是在命令列上編譯 Amplification Shader 的範例。
其結構與計算著色器相同,差別只在於選擇性的 DispatchMesh 內建函式呼叫,此呼叫會分派一組 Mesh Shader 子系。下列程式碼範例概述了一個非常通用的 Amplification Shader,只是為了顯示整體結構。 如需 Amplification Shader 的完整應用,請參閱 Meshlet 剔除範例。 下列程式碼範例顯示 Amplification Shader 的通用概要。

另請參閱

Mesh Shader 管線概觀 為什麼要使用 Mesh Shader? Mesh Shader API 概觀 Meshlet Meshlet 剔除範例
最後修改於 2026年10月6日