次の方法で共有


可変レート シェーディング (VRS)

VRS の動機

パフォーマンスの制約により、グラフィックス レンダラーでは、出力イメージのすべての部分に同じレベルの品質を提供できるわけではありません。 可変レート シェーディング (粗ピクセル シェーディング) は、レンダリングイメージ全体で異なるレートでレンダリングパフォーマンス/パワーを割り当てることができるメカニズムです。

場合によっては、シェーディング レートは、知覚可能な出力品質をほとんどまたはまったく低下させず、削減できます。は、本質的に無料のパフォーマンス向上につながります。

VRS を使用しない - スーパーサンプリングを使用したマルチサンプルアンチエイリアシング

可変レート シェーディングを使用しない場合、シェーディング レートを制御する唯一の方法は、サンプル ベースの実行 (スーパーサンプリングとも呼ばれます) を使用するマルチサンプル アンチエイリアシング (MSAA) を使用することです。

MSAA は、ジオメトリ エイリアシングを減らし、MSAA を使用しない場合と比較して画像のレンダリング品質を向上させるメカニズムです。 MSAA サンプル数 (1x、2x、4x、8x、または 16x) は、レンダー ターゲット ピクセルごとに割り当てられるサンプルの数を制御します。 MSAA サンプル数は、ターゲットが割り当てられるときに前もって認識されている必要があり、その後は変更できません。

スーパーサンプリングにより、ピクセル シェーダーはサンプルごとに 1 回呼び出され、品質は高くなりますが、ピクセル単位の実行と比較してパフォーマンス コストも高くなります。

アプリケーションでは、ピクセル単位の実行または MSAA とスーパーサンプリングのどちらを選択するかによって、そのシェーディング レートを制御できます。 これら 2 つのオプションでは、細かい制御は提供されません。 また、イメージの残りの部分と比較して、特定のクラスのオブジェクトのシェーディング レートを低くしたい場合もあります。 このようなオブジェクトには、HUD 要素の背後にあるオブジェクト、透明度、ぼかし (被写界深度、モーションなど)、または VR 光学による光学歪みが含まれる場合があります。 しかし、シェーディングの品質とコストはイメージ全体で固定されているため、それは不可能です。

可変レート シェーディング (VRS) を使用する

可変レート シェーディング (VRS) モデルは、粗いシェーディングの概念を追加することで、スーパーサンプリングと MSAA を逆の "粗いピクセル" 方向に拡張します。 これは、ピクセルよりも粗い周波数でシェーディングを実行できる場所です。 つまり、ピクセルのグループは 1 つの単位として網掛けでき、結果はグループ内のすべてのサンプルにブロードキャストされます。

粗いシェーディング API を使用すると、アプリケーションで、網掛けされたグループに属するピクセル数を指定したり、粗いピクセル したりできます。 レンダー ターゲットを割り当てた後で、粗いピクセル サイズを変更できます。 そのため、画面の一部や描画パスが異なると、シェーディング レートが異なる場合があります。

粗いシェーディングをサポートするプラットフォームで、どの MSAA レベルがどの粗いピクセル サイズでサポートされているかを説明する表を次に示します。

  • Y マークされたセルの場合、その組み合わせが有効になります。
  • キャップ マークされたセルの場合、その組み合わせは、キャップ (AdditionalShadingRatesSupported) に基づいて条件付きで有効になります。
  • 空白のセルの場合、その組み合わせはサポートされていません。
  • ハーフトーン シェーディングされたセルの場合、その組み合わせはサポートされていません。し、 ピクセル シェーダー呼び出しごとに 16 個を超えるサンプルを追跡する必要があります。 16 を超えるサンプルを追跡する場合は、他のケースと比較して、サポートする追加のハードウェア アラインメント バリアがあります。

表は、M S A A レベルの粗いピクセル サイズを示しています。

機能レベル

VRS 実装には 2 つのレベルがあり、クエリを実行できる 2 つの機能があります。 各レベルについては、テーブルの後で詳しく説明します。

表は、階層 1 と階層 2 で使用できる機能を示しています。

階層 1

  • シェーディング レートは、描画単位でのみ指定できます。それ以上の細かい。
  • シェーディング レートは、レンダー ターゲット内のどこにあるかとは無関係に描画される内容に均一に適用されます。

階層 2

  • シェーディング レートは、階層 1 のように描画ごとに指定できます。 また、描画ごとに次の組み合わせで指定することもできます。
    • 各誘発頂点からのセマンティック、および
    • 画面空間イメージ。
  • 3 つのソースからのシェーディング レートは、一連のコンバイナーを使用して結合されます。
  • 画面空間イメージのタイル サイズは 16 x 16 以下です。
  • アプリケーションによって要求されるシェーディング レートは、(テンポラルおよびその他の再構築フィルターの精度のために) 正確に配信することが保証されます。
  • SV_ShadingRate PS 入力がサポートされています。
  • 誘発ごとの頂点 (プリミティブ単位とも呼ばれます) シェーディング レートは、1 つのビューポートが使用され、SV_ViewportArrayIndex が書き込まれていない場合に有効です。
  • SupportsPerVertexShadingRateWithMultipleViewports 機能が trueに設定されている場合、誘発ごとの頂点レートを複数のビューポートで使用できます。 さらに、その場合、SV_ViewportArrayIndex の書き込み時にそのレートを使用できます。

機能の一覧

  • AdditionalShadingRatesSupported
    • ブール型。
    • 単一サンプリング レンダリングで 2x4、4x2、4x4 の粗いピクセル サイズがサポートされているかどうかを示します。2x MSAA で粗いピクセル サイズ 2x4 がサポートされているかどうか。
  • SupportsPerVertexShadingRateWithMultipleViewports
    • ブール型。
    • 頂点ごとの (プリミティブ単位とも呼ばれる) シェーディング レートで複数のビューポートを使用できるかどうかを示します。

シェーディング レートの指定

アプリケーションの柔軟性を高めるために、シェーディング レートを制御するためのさまざまなメカニズムが用意されています。 ハードウェア機能レベルに応じて、さまざまなメカニズムを使用できます。

コマンド リスト

これは、シェーディング レートを設定するための最も簡単なメカニズムです。 すべてのレベルで使用できます。

アプリケーションでは、ID3D12GraphicsCommandList5::RSSetShadingRate メソッドを使用して粗いピクセル サイズ指定できます。 その API は、単一の列挙型引数を受け取ります。 この API は、レンダリングの品質レベルの全体的な制御を提供します。これは、描画ごとにシェーディング レートを設定する機能です。

この状態の値は、D3D12_SHADING_RATE 列挙体によって表されます。

粗ピクセル サイズのサポート

シェーディング レート 1x1、1x2、2x1、2x2 はすべてのレベルでサポートされています。

AdditionalShadingRatesSupported 、デバイスで 2x4、4x2、4x4 がサポートされているかどうかを示す機能があります。

画面空間イメージ (イメージ ベース)

階層 2 以降では、画面空間イメージでピクセル シェーディング レートを指定できます。

画面空間イメージを使用すると、モーション ブラー、被写界深度ブラー、透明オブジェクト、HUD UI 要素で覆われる領域など、さまざまな品質の領域を示す "詳細レベル (LOD) マスク" イメージをアプリケーションで作成できます。 画像の解像度はマクロブロックにあります。レンダー ターゲットの解像度ではありません。 つまり、シェーディング レート データは、VRS タイル サイズで示されているように、8 x 8 または 16 x 16 ピクセルのタイルの粒度で指定されます。

タイル サイズ

アプリケーションでは、API に対してクエリを実行して、そのデバイスでサポートされている VRS タイル サイズを取得できます。

タイルは正方形で、サイズはテクセル内のタイルの幅または高さを指します。

ハードウェアが階層 2 の可変レート シェーディングをサポートしていない場合、タイル サイズの機能クエリは 0 を返します。

ハードウェア が階層 2 の可変レート シェーディングをサポート 場合、タイル サイズはこれらの値のいずれかになります。

  • 8
  • 16
  • 32

画面領域の画像サイズ

サイズ {rtWidth, rtHeight} のレンダー ターゲットの場合、VRSTileSize という名前の指定されたタイル サイズを使用して、そのサイズをカバーする画面空間イメージはこれらのサイズです。

{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }

画面空間イメージの左上 (0, 0) は、レンダー ターゲットの左上 (0, 0) にロックされます。

レンダー ターゲット内の特定の位置に対応するタイルの (x,y) 座標を検索するには、(x, y) のウィンドウ空間座標をタイル サイズで除算し、小数部のビットを無視します。

画面空間イメージが特定のレンダー ターゲットに対して必要以上に大きい場合、右側または下部の余分な部分は使用されません。

特定のレンダー ターゲットに対して画面空間イメージが小さすぎる場合、イメージから実際のエクステントを超えて読み取ろうとすると、既定のシェーディング レートは 1x1 になります。 これは、画面空間イメージの左上 (0, 0) がレンダー ターゲットの左上 (0, 0) にロックされており、"レンダー ターゲットのエクステントを超えて読み取る" とは、x と y の値の読み取りが大きすぎることを意味するためです。

形式、レイアウト、リソースのプロパティ

このサーフェスの形式は、シングルチャネルの 8 ビット サーフェス (DXGI_FORMAT_R8_UINT) です。

リソースはディメンション TEXTURE2Dです。

配列またはミップすることはできません。 1 つのミップ レベルを明示的に持つ必要があります。

サンプル数 1 とサンプル品質 0 があります。

不明な テクスチャ レイアウトがあります。 クロスアダプターは許可されていないため、暗黙的に行優先レイアウトにすることはできません。

画面空間イメージ データが設定される予想される方法は、次のいずれかです。

  1. コンピューティング シェーダーを使用してデータを書き込む。画面空間イメージが UAV としてバインドされているか、または
  2. 画面空間イメージにデータをコピーします。

画面空間イメージを作成するときに、これらのフラグが許可されます。

  • 何一つ
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

これらのフラグは使用できません。

  • ALLOW_RENDER_TARGET
  • ALLOW_DEPTH_STENCIL
  • ALLOW_CROSS_ADAPTER
  • ALLOW_SIMULTANEOUS_ACCESS
  • VIDEO_DECODE_REFERENCE_ONLY

リソースのヒープの種類を UPLOAD または READBACK にすることはできません。

リソースをSIMULTANEOUS_ACCESSすることはできません。 リソースをクロスアダプターにすることはできません。

データ

画面空間イメージの各バイトは、D3D12_SHADING_RATE 列挙型の値に対応します。

リソースの状態

画面空間イメージとして使用する場合は、リソースを読み取り専用の状態に移行する必要があります。 この目的のために、読み取り専用の状態 (D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE) が定義されています。

イメージ リソースは、再び書き込み可能になるように、その状態から遷移します。

イメージの設定

シェーダー レートを指定するための画面空間イメージがコマンド リストに設定されます。

シェーディング レート ソースとして設定されているリソースは、シェーダー ステージから読み取ったり書き込んだりすることはできません。

シェーダー レートを指定するために、null 画面空間イメージを設定できます。 これは、画面空間イメージからのコントリビューションとして 1x1 が一貫して使用される効果があります。 画面空間イメージは、最初は nullに設定されていると見なすことができます。

昇格と減衰

画面空間イメージ リソースには、昇格または減衰に関して特別な影響はありません。

プリミティブ単位の属性

プリミティブ単位の属性では、誘発する頂点からの属性としてシェーディング レート項を指定する機能が追加されます。 この属性はフラット シェーディングされます。つまり、現在の三角形または線プリミティブ内のすべてのピクセルに伝達されます。 プリミティブ単位の属性を使用すると、他のシェーディング レート指定子と比較して、画質をきめ細かく制御できます。

プリミティブごとの属性は、SV_ShadingRateという名前の設定可能なセマンティックです。 SV_ShadingRate HLSL シェーダー モデル 6.4 の一部として存在します。

VS または GS が SV_ShadingRate設定しているが、VRS が有効になっていない場合、セマンティック設定は無効になります。 SV_ShadingRate の値がプリミティブ単位で指定されていない場合、シェーディング レート値 1x1 はプリミティブ単位のコントリビューションと見なされます。

シェーディング レート 係数の組み合わせ

この図を使用して、シェーディング レートのさまざまなソースが順番に適用されます。

ダイアグラムは、パイプラインの状態を示し、A とラベル付けされ、頂点シェーディング レートを誘発し、B というラベルを付け、コンバイナーで適用し、次に B というラベルの付いたイメージ ベースのシェーディング レートをコンバイナーで適用します。

A と B の各ペアはコンバイナーを使用して結合されます。

* 頂点属性でシェーダー レートを指定する場合。

  • ジオメトリ シェーダーを使用する場合は、そのシェーダーを使用してシェーディング レートを指定できます。
  • ジオメトリ シェーダーを使用しない場合、シェーディング レートは誘発する頂点によって指定されます。

コンバイナーの一覧

次のコンバイナーがサポートされています。 コンバイナー (C) と 2 つの入力 (A と B) の使用。

  • パススルー します。 C.xy = A.xy。
  • をオーバーライドします。 C.xy = B.xy。
  • 高品質の. C.xy = min(A.xy, B.xy).
  • 低品質. C.xy = max(A.xy, B.xy).
  • Aに対してコスト B を適用します。C.xy = min(maxRate, A.xy + B.xy).

ここで、maxRate はデバイス上の粗いピクセルの最大許容寸法です。 これは次のようになります。

  • AdditionalShadingRatesSupported が false場合は、D3D12_AXIS_SHADING_RATE_2X (つまり、値 1)。
  • AdditionalShadingRatesSupported が trueされている場合は、D3D12_AXIS_SHADING_RATE_4X (つまり、値 2)。

可変レート シェーディングのコンバイナーの選択は、コマンド リストで ID3D12GraphicsCommandList5::RSSetShadingRateによって設定されます。

コンバイナーが設定されていない場合は、既定値 (PASSTHROUGH) のままです。

コンバイナーへのソースがサポート テーブルで許可されていない D3D12_AXIS_SHADING_RATEである場合、入力は、サポート シェーディング レートにサニタイズされます。

コンバイナーの出力がプラットフォームでサポートされているシェーディング レートに対応していない場合、結果は、がサポート シェーディング レートにサニタイズされます。

既定の状態と状態のクリア

すべてのシェーディング レート ソース、つまり

  • パイプラインの状態指定レート (コマンド リストで指定)
  • 画面空間のイメージ指定レート、および
  • プリミティブごとの属性

の既定値は D3D12_SHADING_RATE_1X1です。 既定のコンバイナーは {PASSTHROUGH,PASSTHROUGH} です。

画面空間イメージが指定されていない場合、そのソースから 1x1 のシェーディング レートが推論されます。

プリミティブ単位の属性が指定されていない場合は、そのソースから 1x1 のシェーディング レートが推論されます。

ID3D12CommandList::ClearState は、パイプラインの状態指定レートを既定値にリセットし、画面空間イメージの選択を既定の "画面空間イメージなし" にリセットします。

SV_ShadingRateを使用したシェーディング レートのクエリ

特定のピクセル シェーダー呼び出しでハードウェアによって選択されたシェーディング レートを把握すると便利です。 これにより、PS コードでさまざまな最適化が可能になる可能性があります。 PS 専用システム変数 (SV_ShadingRate) は、シェーディング レートに関する情報を提供します。

種類

このセマンティックの型は uint です。

データの解釈

データは、D3D12_SHADING_RATE 列挙体の値として解釈されます。

VRS が使用されていない場合

粗いピクセル シェーディングが使用されていない場合、SV_ShadingRate は 1x1 の値として読み戻され、細かいピクセルが示されます。

サンプル ベースの実行での動作

ピクセル シェーダーは、SV_ShadingRate を入力し、サンプル ベースの実行 (たとえば、SV_SampleIndexを入力したり、サンプル補間キーワードを使用するなど) を使用した場合、コンパイルに失敗します。

遅延シェーディングに関する解説

遅延シェーディング アプリケーションのライティング パスでは、画面のどの領域にどのシェーディング レートが使用されたかを把握することが必要な場合があります。 これは、照明パスディスパッチが粗い速度で起動できるようにするためです。 SV_ShadingRate 変数は、gbuffer に書き出された場合にこれを実現するために使用できます。

深度とステンシル

粗いピクセル シェーディングを使用すると、深度とステンシルとカバレッジは常に計算され、完全なサンプル解像度で出力されます。

要求されたシェーディング レートの使用

すべてのレベルで、シェーディング レートが要求され、デバイスと MSAA レベルの組み合わせでサポートされている場合、ハードウェアによって提供されるシェーディング レートが期待されます。

要求されたシェーディング レートとは、コンバイナーの出力として計算されるシェーディング レートを意味します (このトピックの「シェーディング レート 係数の組み合わせ」セクションを参照してください)。

サポートされているシェーディング レートは、サンプル数が 4 以下のレンダリング操作で 1x1、1x2、2x1、または 2x2 です。 AdditionalShadingRatesSupported 機能が trueされている場合は、一部のサンプル数に対して 2x4、4x2、4x4 もシェーディング レートがサポートされます (このトピックの「可変レート シェーディング (VRS) を使用する」 セクションの表を参照してください)。

画面空間の派生物

ピクセルから隣接するピクセル グラデーションの計算は、粗いピクセル シェーディングの影響を受けます。 たとえば、2x2 の粗いピクセルを使用する場合、グラデーションは粗いピクセルを使用しない場合と比較して 2 倍のサイズになります。 アプリケーションでは、必要な機能に応じて、これを補うためにシェーダーを調整することが必要な場合があります。

ミップは画面空間の派生物に基づいて選択されるため、粗いピクセル シェーディングの使用はミップの選択に影響します。 粗いピクセル シェーディングを使用すると、粗いピクセルを使用しない場合と比較して、より詳細なミップが選択されます。

属性補間

ピクセル シェーダーへの入力は、ソース頂点に基づいて補間できます。 可変レート シェーディングは、ピクセル シェーダーの呼び出しごとに書き込まれたターゲットの領域に影響するため、属性補間と対話します。 3 種類の補間は、中心、重心、サンプルです。

センター

粗いピクセルの中心補間位置は、粗いピクセル領域全体の幾何学的中心です。 SV_Position は常に粗いピクセル領域の中心で補間されます。

重心

粗いピクセル シェーディングが MSAA で使用されている場合、各細かいピクセルに対して、ターゲットの MSAA レベルに割り当てられたサンプルの全数への書き込みが行われます。 したがって、重心補間の場所では、粗いピクセル内の細かいピクセルのすべてのサンプルが考慮されます。 つまり、重心補間位置は、サンプル インデックスの増加順で、最初にカバーされるサンプルとして定義されます。 サンプルの有効カバレッジは、ラスタライザー状態 SampleMask の対応するビットで AND で処理されます。

手記

階層 1 で粗いピクセル シェーディングを使用する場合、SampleMask は常にフル マスクです。 SampleMask が完全マスクでないように構成されている場合、階層 1 では粗いピクセル シェーディングが無効になります。

サンプル ベースの実行

サンプル ベースの実行、またはサンプル補間機能の使用によって発生するスーパーサンプリング は、粗いピクセル シェーディングで使用でき、サンプルごとにピクセル シェーダーが呼び出されます。 サンプル カウント N のターゲットの場合、ピクセル シェーダーは細かいピクセルごとに N 回呼び出されます。

EvaluateAttributeSnapped

プル モデル組み込み関数は、階層 1 の粗いピクセル シェーディングと互換性がありません。 階層 1 で粗いピクセル シェーディングでプル モデル組み込みを使用しようとすると、粗いピクセル シェーディングが自動的に無効になります。

組み込み EvaluateAttributeSnapped は、階層 2 の粗いピクセル シェーディングで使用できます。 その構文は、これまでと同じです。

numeric EvaluateAttributeSnapped(	
    in attrib numeric value, 
    in int2 offset);

コンテキストの場合、EvaluateAttributeSnapped には 2 つのフィールドを持つオフセット パラメーターがあります。 粗いピクセル シェーディングなしで使用する場合は、完全な 32 ビットのうち下位 4 ビットだけが使用されます。 これら 4 つのビットは範囲 [-8, 7] を表します。 この範囲は、ピクセル内の 16 x 16 のグリッドにまたがっています。 この範囲は、ピクセルの上端と左端が含まれていて、下端と右端が含まれていないような範囲です。 オフセット (-8、-8) は左上隅にあり、オフセット (7, 7) は右下隅にあります。 オフセット (0, 0) はピクセルの中心です。

粗いピクセル シェーディングで使用する場合、EvaluateAttributeSnappedのオフセット パラメーターは、より広い範囲の場所を指定できます。 オフセット パラメーターは、細かいピクセルごとに 16 x 16 のグリッドを選択し、複数の細かいピクセルがあります。 表現可能な範囲と結果として使用されるビット数は、粗いピクセル サイズによって異なります。 粗いピクセルの上端と左端は含まれており、下端と右端は含まれません。

次の表では、粗いピクセル サイズごとに EvaluateAttributeSnappedのオフセット パラメーターの解釈について説明します。

EvaluateAttributeSnapped のオフセット範囲

粗いピクセル サイズ インデックス可能範囲 表現可能な範囲のサイズ 必要なビット数 {x, y} 使用可能なビットのバイナリ マスク
1x1 (正常) {[-8, 7], [-8, 7]} {16, 16} {4, 4} {000000000000xxxx, 000000000000xxxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {0000000000000xxxx, 00000000000xxxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {00000000000xxxxx, 000000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {00000000000xxxxx, 00000000000xxxxx}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {00000000000xxxxx, 0000000000xxxxxx}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {0000000000xxxxxx, 00000000000xxxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {0000000000xxxxxx, 0000000000xxxxxx}

次の表は、固定小数点から 10 進数および小数部表現への変換のガイドです。 バイナリ マスクの最初の使用可能なビットは符号ビットであり、バイナリ マスクの残りの部分は数値部分を構成します。

EvaluateAttributeSnapped に渡される 4 ビット値の数値スキームは、可変レート シェーディングに固有ではありません。 ここでは、完全性について繰り返し説明します。

4 ビット値の場合。

バイナリ値 小数 小数
1000 -0.5f -8 / 16
1001 -0.4375f -7 / 16
1010 -0.375f -6 / 16
1011 -0.3125f -5 / 16
1100 -0.25f -4 / 16
1101 -0.1875f -3 / 16
1110 -0.125f -2 / 16
1111 -0.0625f -1 /16
0000 0.0f 0 / 16
0001 -0.0625f 1 / 16
0010 -0.125f 2 / 16
0011 -0.1875f 3 / 16
0100 -0.25f 4 / 16
0101 -0.3125f 5 / 16
0110 -0.375f 6 / 16
0111 -0.4375f 7 / 16

5 ビット値の場合。

バイナリ値 小数 小数
10000 -1 -16 / 16
10001 -0.9375 -15 / 16
10010 -0.875 -14 / 16
10011 -0.8125 -13 / 16
10100 -0.75 -12 / 16
10101 -0.6875 -11 / 16
10110 -0.625 -10 / 16
10111 -0.5625 -9 / 16
11000 -0.5 -8 / 16
11001 -0.4375 -7 / 16
11010 -0.375 -6 / 16
11011 -0.3125 -5 / 16
11100 -0.25 -4 / 16
11101 -0.1875 -3 / 16
11110 -0.125 -2 / 16
11111 -0.0625 -1 / 16
00000 0 0 / 16
00001 0.0625 1 / 16
00010 0.125 2 / 16
00011 0.1875 3 / 16
00100 0.25 4 / 16
00101 0.3125 5 / 16
00110 0.375 6 / 16
00111 0.4375 7 / 16
01000 0.5 8 / 16
01001 0.5625 9 / 16
01010 0.625 10 / 16
01011 0.6875 11 / 16
01100 0.75 12 / 16
01101 0.8125 13 / 16
01110 0.875 14 / 16
01111 0.9375 15 / 16

6 ビット値の場合。

バイナリ値 小数 小数
100000 -2 -32 / 16
100001 -1.9375 -31 / 16
100010 -1.875 -30 / 16
100011 -1.8125 -29 / 16
100100 -1.75 -28 / 16
100101 -1.6875 -27 / 16
100110 -1.625 -26 / 16
100111 -1.5625 -25 / 16
101000 -1.5 -24 / 16
101001 -1.4375 -23 / 16
101010 -1.375 -22 / 16
101011 -1.3125 -21 / 16
101100 -1.25 -20 / 16
101101 -1.1875 -19 / 16
101110 -1.125 -18 / 16
101111 -1.0625 -17 / 16
110000 -1 -16 / 16
110001 -0.9375 -15 / 16
110010 -0.875 -14 / 16
110011 -0.8125 -13 / 16
110100 -0.75 -12 / 16
110101 -0.6875 -11 / 16
110110 -0.625 -10 / 16
110111 -0.5625 -9 / 16
111000 -0.5 -8 / 16
111001 -0.4375 -7 / 16
111010 -0.375 -6 / 16
111011 -0.3125 -5 / 16
111100 -0.25 -4 / 16
111101 -0.1875 -3 / 16
111110 -0.125 -2 / 16
111111 -0.0625 -1 / 16
000000 0 0 / 16
000001 0.0625 1 / 16
000010 0.125 2 / 16
000011 0.1875 3 / 16
000100 0.25 4 / 16
000101 0.3125 5 / 16
000110 0.375 6 / 16
000111 0.4375 7 / 16
001000 0.5 8 / 16
001001 0.5625 9 / 16
001010 0.625 10 / 16
001011 0.6875 11 / 16
001100 0.75 12 / 16
001101 0.8125 13 / 16
001110 0.875 14 / 16
001111 0.9375 15 / 16
010000 1 16 / 16
010001 1.0625 17 / 16
010010 1.125 18 / 16
010011 1.1875 19 / 16
010100 1.25 20 / 16
010101 1.3125 21 / 16
010110 1.375 22 / 16
010111 1.4375 23 / 16
011000 1.5 24 / 16
011001 1.5625 25 / 16
011010 1.625 26 / 16
011011 1.6875 27 / 16
011100 1.75 28 / 16
011101 1.8125 29 / 16
011110 1.875 30 / 16
011111 1.9375 31 / 16

細いピクセルの場合と同様に、粗いピクセル シェーディングを使用する場合、評価可能な位置の EvaluateAttributeSnappedグリッドが粗いピクセル中心に中央揃えされます。

SetSamplePositions

API ID3D12GraphicsCommandList1::SetSamplePositions を粗い網かけで使用する場合、API は細かいピクセルのサンプル位置を設定します。

SV_Coverage

SV_Coverage が階層 1 でシェーダー入力または出力として宣言されている場合、粗いピクセル シェーディングは無効になります。

階層 2 では粗いピクセル シェーディングで SV_Coverage セマンティックを使用でき、書き込まれている MSAA ターゲットのサンプルが反映されます。

粗いピクセル シェーディングを使用する場合 (複数のソース ピクセルがタイルを構成できるようにする)、カバレッジ マスクは、そのタイルから取得されるすべてのサンプルを表します。

粗いピクセル シェーディングと MSAA の互換性を考えると、指定する必要があるカバレッジ ビットの数は異なる場合があります。 たとえば、D3D12_SHADING_RATE_2x2を使用する 4 倍の MSAA リソースでは、各粗いピクセルは 4 つの細かいピクセルに書き込み、各細かいピクセルには 4 つのサンプルがあります。 つまり、各粗いピクセルは合計 4 * 4 = 16 サンプルに書き込まれます。

必要なカバレッジ ビットの数

次の表は、粗いピクセル サイズと MSAA レベルの組み合わせごとに必要なカバレッジ ビットの数を示しています。

表は、粗いピクセル サイズ、細かいピクセル数、および MS A レベルを示しています。

表に示すように、Direct3D 12 で公開されている可変レート シェーディング機能を使用して、粗いピクセルを使用して一度に 16 個を超えるサンプルに書き込むことはできません。 この制限は、どの MSAA レベルがどの粗いピクセル サイズで許可されているかに関する Direct3D 12 の制約によるものです (このトピックの「可変レート シェーディング (VRS) の使用」 セクションの表を参照してください)。

カバレッジ マスク内のビットの順序と形式

カバレッジ マスクのビットは、明確に定義された順序に従います。 マスクは、ピクセルの範囲を左から右、上から下 (列メジャー) の順序で構成します。 カバレッジ ビットはカバレッジ セマンティックの下位ビットであり、一緒に密にパックされます。

次の表は、粗いピクセル サイズと MSAA レベルのサポートされている組み合わせのカバレッジ マスク形式を示しています。

表は、粗いピクセル サイズ、粗いピクセル図、および 1 x M S A A カバレッジ ビットを示しています。1 倍の でカバレッジ

次の表は、2x MSAA ピクセルを示しています。各ピクセルにはインデックス 0 と 1 の 2 つのサンプルがあります。

ピクセル上のサンプルのラベルの配置は説明を目的としており、そのピクセル上のサンプルの空間 {X, Y} の位置を必ずしも伝えるわけではありません。特に、サンプルの位置をプログラムで変更できることを考えると、 サンプルは、0 から始まるインデックスによって参照されます。

表は、粗いピクセル サイズ、粗いピクセル図、および 2 x M S A A カバレッジ ビットを示しています。2 倍の でカバレッジ

次の表は、4x MSAA ピクセルを示しています。各ピクセルには、インデックス 0、1、2、3 の 4 つのサンプルがあります。

表は、粗いピクセル サイズ、粗いピクセル図、および 4 x M S A A カバレッジ ビットを示しています。4 倍の でカバレッジ

捨てる

HLSL セマンティック discard を粗いピクセル シェーディングで使用すると、粗いピクセルは破棄されます。

ターゲットに依存しないラスター化 (TIR)

粗いピクセル シェーディングを使用する場合、TIR はサポートされません。

ラスター順序ビュー (ROV)

ROV インターロックは、細かいピクセル細分性で動作するように指定されます。 サンプルごとにシェーディングが実行される場合、インターロックはサンプルの粒度で動作します。

保守的なラスター化

可変レート シェーディングでは保守的なラスター化を使用できます。 粗いピクセル シェーディングで保守的なラスター化を使用する場合、粗いピクセル内の細かいピクセルは、完全なカバレッジが与えられ、保守的にラスター化されます。

カバレッジ

保守的なラスター化を使用する場合、カバレッジ セマンティックには、カバーされる細かいピクセルの完全なマスクと、カバーされていない細かいピクセルの場合は 0 が含まれます。

バンドル

バンドルで可変レート シェーディング API を呼び出すことができます。

レンダー パス

レンダー パスで可変レート シェーディング API を呼び出すことができます。

VRS API の呼び出し

この次のセクションでは、Direct3D 12 を介してアプリケーションから可変レート シェーディングにアクセスする方法について説明します。

機能のクエリ

アダプターの可変レート シェーディング機能を照会するには、D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6ID3D12Device::CheckFeatureSupport を呼び出し、入力する関数の D3D12_FEATURE_DATA_D3D12_OPTIONS6 構造 を指定します。 D3D12_FEATURE_DATA_D3D12_OPTIONS6 構造体には、列挙型の D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) のメンバーと、バックグラウンド処理がサポートされているかどうかを示すメンバー (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported) など、複数のメンバーが含まれています。

たとえば、階層 1 の機能を照会するには、これを行います。

D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return 
    SUCCEEDED(m_device->CheckFeatureSupport(
        D3D12_FEATURE_D3D12_OPTIONS6, 
        &options, 
        sizeof(options))) && 
    options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;

シェーディング レート

D3D12_SHADING_RATE 列挙 の値は、シェーディング レートを 2 つの軸に簡単に分解できるように編成され、各軸の値は、D3D12_AXIS_SHADING_RATE 列挙に従って対数空間でコンパクトに表されます。

マクロを作成して、2 つの軸シェーディング レートを次のようなシェーディング レートに作成できます。

#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
    D3D12_AXIS_SHADING_RATE_2X, 
    D3D12_AXIS_SHADING_RATE_1X)

プラットフォームには、d3d12.hで定義されているこれらのマクロも用意されています。

#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )

これらは、SV_ShaderRateを解剖し、理解するために使用することができます.

手記

このデータ解釈は、シェーダーによって操作できる画面空間イメージの記述を対象としています。 これについては、上記のセクションで詳しく説明します。 ただし、コマンド レベルのシェーディング レートを設定する場合を含め、すべての場所で使用される粗いピクセル サイズの定義が一貫していない理由はありません。

コマンド レベルのシェーディング レートとコンバイナーの設定

シェーディング レートと、必要に応じて、コンバイナーは ID3D12GraphicsCommandList5::RSSetShadingRate メソッドによって指定されます。 基本シェーディング レートの D3D12_SHADING_RATE 値と、D3D12_SHADING_RATE_COMBINER 値の省略可能な配列を渡します。

画面空間イメージの準備

使用可能なシェーディング レート イメージを指定する読み取り専用リソースの状態は、D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCEとして定義されます。

画面空間イメージの設定

画面空間イメージは、ID3D12GraphicsCommandList5::RSSetShadingRateImage メソッドを使用して指定します。

m_commandList->RSSetShadingRateImage(screenSpaceImage);

タイル サイズのクエリ

タイル サイズは、D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize メンバーから照会できます。 上記 機能のクエリ を参照してください。

水平ディメンションと垂直ディメンションは常に同じであるため、1 つのディメンションが取得されます。 システムの機能が D3D12_SHADING_RATE_TIER_NOT_SUPPORTED場合、返されるタイル サイズは 0 です。