優化 HLSL 著色器

本節說明可用來優化著色器的一般用途策略。 您可以將這些策略套用至在任何平臺上以任何語言撰寫的著色器。

瞭解執行著色器計算的位置

頂點著色器會執行包含擷取頂點和執行頂點資料矩陣轉換的作業。 一般而言,每個頂點會執行一次頂點著色器。

圖元著色器會執行包含擷取紋理資料和執行光源計算的作業。 一般而言,圖元著色器會針對指定的幾何片段執行每個圖元一次。

一般而言,場景中的圖元超出頂點數,因此圖元著色器的執行頻率高於頂點著色器。

當您設計著色器演算法時,請記住下列事項:

  • 可能的話,請在頂點著色器上執行計算。 在圖元著色器上執行的計算比在頂點著色器上執行的計算成本更高。
  • 請考慮使用每個頂點計算來改善密集網格等情況的效能。 針對密集的網格,每個頂點計算可能會產生結果,這些結果會以視覺化方式從以個別圖元計算產生的結果中區分。

略過不必要的指示

在 HLSL 中,動態分支可讓您限制執行的指令數目。 因此,動態分支有助於加速著色器執行時間。 如果未顯示幾何或圖元,請使用動態分支結束著色器或限制指示。 例如,如果圖元未亮起,則執行光源演算法時沒有點。

下表列出一些案例,您可以在著色器中測試條件,並使用動態分支略過不必要的指示。 資料表不完整。 而是要提供您優化程式碼的想法。

要檢查的條件 著色器中的回應
Alpha 檢查會判斷不會看到圖元。 略過著色器的其餘部分。
圖元或幾何完全模糊。 略過著色器的其餘部分。
面板權數為零。 略過骨。
光線衰減為零。 略過光源。
非正向 Lambertian 詞彙。 略過光源。

 

封裝變數和插補項

請留意著色器資料所需的空間。 盡可能將大部分資訊封裝到變數或插補項中。 有時候,來自兩個變數的資訊可以封裝到單一變數的記憶體空間中。

減少著色器複雜度

讓您的著色器保持較小且簡單。 一般而言,具有較少指令的著色器會比著色器更快速地執行更多指示。 偵錯和優化較小型、較不復雜的著色器也比較容易。

HLSL 的程式設計指南

HLSL 的程式設計指南