Announcing Variable Rate Shading – a new API for developers to boost rendering performance! https://t.co/GQV74EjU9a.
— DirectX 12 (@DirectX12) 2019年3月18日
DirectX Developer BlogでVariable Rate Shading(VRS)の概要を説明した記事が公開になりました.GDC 2019ではセッションも開催されます.
Variable Rate Shading: a scalpel in a world of sledgehammers
https://devblogs.microsoft.com/directx/variable-rate-shading-a-scalpel-in-a-world-of-sledgehammers/
Variable Rate Shading はシェーダがピクセルを塗る際に,1ピクセル単位ではなく複数ピクセルをまとめて塗ることでシェーダの呼び出しを抑制します.これによりVRなどでユーザーがあまり見ないスクリーンの端の方の処理を間引いたり,ジオメトリの起伏がなく法線が均一な部分はシェーディングがまとめられるので処理の軽量化ができます.
Direct3D12では以下の3つの単位でシェーディングレートを変更することができます.
- Per draw…Draw単位での制御
- Within a draw by using a screenspace image…スクリーンスペース画像での制御
- Or within a draw, per primitive …プリミティブ単位での制御
ハードウェアごとにTier 1とTier 2の2段階のサポートの違いがあるようです.Tier 1では上の3つのシェーディングレートのうちPer drawだけをサポートするようです.
記事ではCivilization VIでTier 1とTier 2の比較と解説をしています.
Civilization VIのTier 1 では海や平地などの起伏が少ない部分(法線が均一と思われる)は2×2のVRSを使い,建物やユニットやUIなどが1×1としているようです.この実装でのパフォーマンス向上は20%のようです.Tier 2ではエッジ検出のフィルタを事前にかけて高周波な部分を高精細に描く必要があると判断するようです,山岳は1×1で通常のシェーディングをするということをしているようで,記事ではシェーディングレートを赤(1×1)と青(2×2)で可視化してしています.これによりTier 1より山岳は詳細になり,14% パフォーマンス向上がしたようです.
最初に,サポートするGPUはNVIDIAとIntelからということになるようです.記事ではIntelのGen 11でTier 2まで実装した例になっています.APIのリリースは今年中ということのようです.PIX for Windowsも最初からサポートされるようです.
高解像度でのシェーディングや低スペックGPUでのパフォーマンス向上は各社悩みがありますので,各種ゲームエンジンもサポートしていくようです.