這篇文章介紹了 NVIDIA GPU 上可變速率著色的最佳實踐。要在應用程序中獲得高且一致的幀速率,請參閱所有 高級 API 性能提示 .
可變速率著色( VRS )是一種圖形功能,允許應用程序獨立于渲染目標的分辨率來控制像素著色器調用的頻率。它有 D3D12 和 Vulkan 兩種版本。
定義 VRS 費率
根據您選擇的 API ,您最多可以有三個選項來定義 VRS 費率:
- 每支取一次的通話費
- 按原始利率計算
- 從屏幕空間陰影率圖像中查找,可以在屏幕的不同區域定義不同的速率
按抽簽通知
這個選項是最容易實現的,只需要在命令流中進行幾個額外的 API 調用,而不需要額外的依賴項。它是最粗的粒度,因此可以將其視為“最寬的畫筆”
每基元
此選項需要增加幾何資產,因此可能需要更改資產在 art 管道中的生成方式或應用程序加載和準備的方式。利用你正在繪制的知識,根據你的需要精確調整著色速率。
屏幕空間查找
此選項需要渲染管道更改,但通常不需要資產或藝術品更改。
最困難/有趣的問題是如何生成著色率圖像:
- 例如, NVIDIA Adaptive Shading ( NAS )使用運動矢量數據和顏色變化數據來確定圖像的哪些部分需要較少的細節。
- 為了有用,生成著色率圖像的算法的性能成本必須小于 VRS 的性能節約。
- 嘗試對渲染引擎已經生成的數據(例如,運動矢量或前一幀結果)使用便宜的算法。
推薦
- 繼續使用現有的圖形優化技術。 VRS 并沒有從根本上改變圖形管道的使用。關于圖形渲染的現有建議仍然適用。 VRS 下操作的主要區別在于,像素著色器工作負載的相對數量可能比正常渲染時小。
- 從使用多采樣消除混疊( MSAA )中尋找交叉應用技術和注意事項。 VRS 的工作原理與 MSAA 類似,因此,它在延遲渲染器中的實用性有限。 VRS 無法幫助提高計算過程的性能。
不推薦
- 在翹曲占用是限制因素的情況下,避免 4 × 4 模式。
- 一般來說,像素著色工作負載與可變著色模式成線性比例。例如, 1 × 2 / 2 × 1 模式有?個 PS 調用, 2 × 2 模式有?個 PS 調用,依此類推。
- 一個例外是 4 × 4 模式,理想情況下,該模式會有 1 / 16 像素著色器調用。但是,在 4 × 4 模式下,光柵化器無法跨越一次生成完整 32 線扭曲所需的整個像素范圍。因此, 4 × 4 模式下的扭曲僅為半活動狀態( 16 個線程而不是 32 個)。
- 如果翹曲占用率是一個限制因素,這意味著 4 × 4 模式可能不會比 4 × 2 / 2 × 4 模式有任何性能優勢,因為翹曲的總數是相同的。
- 在使用 VRS 時,請謹慎使用,并檢查其性能。
- 盡管 VRS 可能會減少正在運行的像素著色器的數量,但混合仍會以全速運行,也就是說,渲染目標中的每個單獨采樣都會運行一次。半透明體積效果是 VRS 的一個潛在候選效果,因為其視覺頻率通常較低,但如果工作負載已經受到 ROP 限制(混合),則使用 VRS 不會改變該限制,因此可能不會導致任何明顯的性能改善。
- 小心使用質心采樣!在“粗像素”上選擇質心樣本可能會以違反直覺的方式工作!確保您熟悉 API 的規范。
- 不要修改像素著色器的輸出深度值。如果像素著色器修改深度, VRS 將自動禁用。