次の方法で共有


Direct3D 12 保守的なラスター化

保守的なラスター化は、ピクセル レンダリングに確実性を追加します。これは、特に衝突検出アルゴリズムに役立ちます。

概要

保守的なラスター化とは、レンダリングされたプリミティブによって少なくとも部分的にカバーされているすべてのピクセルがラスター化されることを意味します。つまり、ピクセル シェーダーが呼び出されます。 通常の動作はサンプリングであり、保守的なラスター化が有効になっている場合は使用されません。

保守的なラスター化は、衝突検出、オクルージョン カリング、タイル レンダリングの確実性など、さまざまな状況で役立ちます。

たとえば、次の図は、ラスタライザー (つまり、16.8 固定点頂点座標を使用) に表示される、保守的なラスター化を使用してレンダリングされた緑色の三角形を示しています。 茶色の領域は、"不確定領域" と呼ばれ、ラスタライザーのプリミティブが元の浮動小数点頂点座標に関して保守的であることを確認するために必要な、三角形の拡張境界を表す概念領域です。 各頂点の赤い四角形は、不確定領域がどのように計算されるかを示します。スイープ四角形として。

大きな灰色の四角形には、レンダリングされるピクセルが表示されます。 ピンクの四角形は、三角形の端がピクセルの端を横切ると再生される"Top-Left ルール"を使用してレンダリングされたピクセルを示しています。 システムが通常は実行するが、常にカリングするとは限らない誤検知 (設定されていないピクセル) が存在する可能性があります。

左上のルールする

パイプラインとの対話

ラスター化ルールの相互作用

保守的なラスター化モードでは、ラスタライズ ルールは、前述の Top-Left ルールとピクセル カバレッジの例外で保守的なラスター化モードが有効になっていない場合と同じように適用されます。 16.8 Fixed-Point ラスタライザー精度を使用する必要があります。

ハードウェアが完全な浮動小数点頂点座標を使用していた場合にカバーされないピクセルは、固定小数点ドメイン内の 1/5 ピクセル以上の不確定領域内にある場合にのみ含まれる可能性があります。 今後のハードウェアは、階層 2 で指定された厳しい不確実性領域に達することが予想されます。 この要件により、スライバー三角形が必要以上に長くならないように注意してください。

同様の有効な不確定領域が InnerCoverage にも適用されますが、実装ではこの場合により大きな不確実性領域が必要ないため、より厳密です。 詳細については、InnerCoverage の相互作用 を参照してください。

内部および外側の不確定領域は、固定小数点領域のサブピクセル グリッドの半分、またはピクセルの 1/512 のサイズ以上である必要があります。 これは、最低限有効な不確定領域です。 1/512 は、16.8 固定小数点ラスタライザー座標表現と、浮動小数点頂点座標を 16.8 固定小数点座標に変換するときに適用される最も近いラウンドツーニアスルールに由来します。 ラスタライザーの精度が変わると、1/512 が変更される可能性があります。 実装でこの最小の不確定領域を実装する場合は、不確定領域のエッジまたはコーナーがピクセルのエッジまたはコーナーに沿って配置されるときに、Top-Left ルールに従う必要があります。 不確定領域のクリップされたエッジは、最も近い頂点として扱う必要があります。つまり、関連付けられた頂点で結合される 2 つのエッジとしてカウントされます。 最小の不確定領域が使用されている場合は、Top-Left ルールが必要です。そうでない場合、保守的なラスター化の実装では、保守的なラスター化モードが無効になっている場合にカバーできるピクセルのラスター化に失敗するためです。

次の図は、固定小数点ドメイン内のプリミティブのエッジの周りに正方形をスイープすることによって生成される有効な外側の不確定領域を示しています (つまり、頂点は 16.8 固定小数点表現によって量子化されています)。 この正方形の寸法は、有効な外側の不確定領域のサイズに基づいています。ピクセルの 1/2 の場合、正方形は幅と高さが 1 ピクセル、ピクセルの 1/512 の場合、正方形は幅と高さのピクセルの 1/256 です。 緑の三角形は特定のプリミティブを表し、赤い点線は過大評価された保守的ラスター化の境界を表し、黒い実線はプリミティブエッジに沿ってスイープされる正方形を表し、青いチェッカー領域は外側の不確定領域です。

外側の不確実性領域。

マルチサンプリング操作

RenderTarget/DepthStencil サーフェス内のサンプルの数 (または ForcedSampleCount 使用されているかどうか) に関係なく、すべてのサンプルは保守的なラスター化によってラスター化されたピクセルでカバーされます。 個々のサンプルの場所は、プリミティブに含まれるかどうかのテストは行われません。

SampleMask の相互作用

SampleMask ラスタライザー状態は、保守的なラスター化が InputCoverageに対して有効になっていない場合と同じように適用されますが、InnerCoverage には影響しません (つまり、InnerCoverageで宣言された入力には AND は含まれません)。 これは、InnerCoverage が MSAA サンプルをマスクアウトするかどうかとは関係がないためです。0 InnerCoverage は、ピクセルが完全にカバーされる保証はなく、サンプルが更新されないことのみを意味します。

深度/ステンシル テストの相互作用

保守的なラスター化が有効になっていない場合、すべてのサンプルがカバーされる場合と同じように、保守的にラスター化されたピクセルの深度/ステンシル テストが続行されます。

対象となるすべてのサンプルを続行すると、深度外挿が発生する可能性があります。これは有効であり、保守的なラスター化が有効になっていない場合に指定されたビューポートにクランプする必要があります。 これは、サンプル数が 1 より大きい RenderTarget でピクセル周波数補間モードを使用する場合と似ていますが、保守的なラスター化の場合は、推定可能な固定関数深度テストに入る深度値です。

深度外挿を使用した早期深度カリング動作は未定義です。 これは、一部の早期深度カリング ハードウェアが、推定された深度値を適切にサポートできないためです。 ただし、深度外挿が存在する場合の早期深度カリング動作は、推定された深度値をサポートできるハードウェアの場合でも問題になります。 この問題を回避するには、ピクセル シェーダーの入力深度をラスター化されるプリミティブの最小深度と最大深度値にクランプし、その値を oDepth (ピクセル シェーダー出力深度レジスタ) に書き込みます。 この場合、oDepth 書き込みのため、早期深度カリングを無効にするには実装が必要です。

ヘルパー ピクセルの相互作用

ヘルパー ピクセル ルールは、保守的なラスター化が有効になっていない場合と同じ方法で適用されます。 この一環として、ヘルパー ピクセルを含むすべてのピクセルは、InputCoverage 相互作用セクションで指定されたとおりに正確に InputCoverage 報告する必要があります。 したがって、完全にカバーされていないピクセルは、0 カバレッジを報告します。

出力カバレッジの相互作用

出力カバレッジ (oMask) は、保守的なラスター化がすべてのサンプルで有効になっていない場合と同様に、保守的にラスター化されたピクセルに対して動作します。

InputCoverage の相互作用

保守的ラスター化モードでは、保守的にラスター化された特定のピクセルに対して保守的なラスター化が有効になっていない場合に、すべてのサンプルがカバーされるかのように、この入力レジスタが設定されます。 つまり、既存のすべての相互作用が適用されます (例: SampleMask が適用されます)、LSB からの InputCoverage の最初の n ビットは、出力マージャーでバインドされた RenderTarget または DepthStencil バッファー 1 ピクセルあたりの n 個のサンプル、または ForcedSampleCount n サンプルに設定されます。 残りのビットは 0 です。

この入力は保守的なラスター化の使用に関係なくシェーダーで使用できますが、保守的なラスター化では、対象となるすべてのサンプルのみを表示するように動作が変更されます (ヘルパー ピクセルの場合はなし)。

InnerCoverage の相互作用

この機能は、階層 3 でのみ必要であり、使用できます。 実装が階層 3 未満の階層をサポートしている場合、ランタイムは、このモードを使用するシェーダーのシェーダーの作成に失敗します。

ピクセル シェーダーには、使用可能な 32 ビットスカラー整数システム生成値があります:InnerCoverage。 これは、特定の保守的にラスター化されたピクセルに対して LSB のビット 0 が 1 に設定されたビット フィールドです。これは、そのピクセルが現在のプリミティブ内に完全に存在することが保証されている場合に限られます。 ビット 0 が設定されていない場合は、他のすべての入力レジスタ ビットを 0 に設定する必要がありますが、ビット 0 が 1 に設定されている場合は未定義です (基本的に、このビット フィールドはブール値を表します。false は正確に 0 である必要がありますが、true は任意の奇数 (つまり、ビット 0 セット) のゼロ以外の値にすることができます)。 この入力は、過小評価された保守的なラスター化情報に使用されます。 現在のピクセルがジオメトリ内に完全に存在するかどうかをピクセル シェーダーに通知します。

これは、現在の Draw が動作している解像度以上の解像度でのスナップ エラーを考慮する必要があります。 誤検知 (ピクセルが現在の Draw が動作している解像度以上の解像度でスナップ エラーが完全にカバーされていない場合は、ビットの InnerCoverage を設定する) は必要ありませんが、偽陰性は許可されます。 要約すると、実装では、ラスタライザーの完全な浮動小数点頂点座標に含まれていない完全にカバーされたピクセルを誤って識別してはなりません。

ハードウェアが完全な浮動小数点頂点座標を使用していた場合に完全にカバーされるピクセルは、固定小数点領域でサブピクセル グリッドのサイズ (ピクセルの 1/256) を超えてはならない内部不確定領域と交差する場合にのみ省略できます。 別の言い方をすると、内部不確定領域の内部境界内にあるピクセルは、完全に覆われたものとしてマークする必要があります。 不確定領域の内側の境界は、下の図に太字の黒い点線で示されています。 1/256 は 16.8 固定小数点ラスタライザー座標表現から取得され、ラスタライザーの精度が変化すると変更される可能性があります。 この不確定領域は、ラスタライザーの浮動小数点頂点座標から固定点頂点座標への変換によって発生するスナップ エラーを考慮するのに十分です。

ラスター化ルールの相互作用で定義されているのと同じ 1/512 最小不確定領域要件がここでも適用されます。

次の図は、固定小数点ドメイン内のプリミティブのエッジの周りに正方形をスイープすることによって生成される有効な内部不確定領域を示しています (つまり、頂点は 16.8 固定小数点表現によって量子化されています)。 この正方形の寸法は、有効な内部不確定領域のサイズに基づいています。ピクセルの 1/256 の場合、正方形は幅と高さのピクセルの 1/128 です。 緑の三角形は特定のプリミティブを表し、太字の黒い点線は内側の不確定領域の境界を表し、黒い実線はプリミティブエッジに沿ってスイープされる正方形を表し、オレンジ色のチェッカー領域は内側の不確定領域です。

内部の不確定性の再要求。

InnerCoverage の使用は、ピクセルが保守的にラスター化されているかどうかには影響しません。つまり、これらの InputCoverage モードのいずれかを使用しても、保守的なラスター化モードが有効になっている場合にラスター化されるピクセルには影響しません。 したがって、InnerCoverage が使用され、ピクセル シェーダーがジオメトリで完全にカバーされていないピクセルを処理している場合、その値は 0 になりますが、ピクセル シェーダー呼び出しではサンプルが更新されます。 これは、InputCoverage が 0 の場合とは異なります。つまり、サンプルは更新されません。

この入力は、InputCoverage と相互に排他的です。どちらも使用できません。

InnerCoverageにアクセスするには、いずれかのピクセル シェーダー入力レジスタから 1 つのコンポーネントとして宣言する必要があります。 宣言の補間モードは一定である必要があります (補間は適用されません)。

InnerCoverage ビット フィールドは深度/ステンシル テストの影響を受けず、SampleMask ラスタライザー状態でも AND されません。

この入力は保守的なラスター化モードでのみ有効です。 保守的なラスター化が有効になっていない場合、InnerCoverage は未定義の値を生成します。

ヘルパー ピクセルが必要な場合に発生するピクセル シェーダー呼び出し。それ以外の場合はプリミティブでカバーされない場合は、InnerCoverage レジスタを 0 に設定する必要があります。

属性補間の相互作用

属性補間モードは変更されず、保守的なラスター化が有効になっていない場合と同じ方法で続行されます。この場合、ビューポートスケールおよび固定ポイント変換された頂点が使用されます。 保守的にラスター化されたピクセル内のすべてのサンプルが対象と見なされるため、サンプル数が 1 より大きい RenderTarget でピクセル周波数補間モードを使用する場合と同様に、値を外挿することが有効です。 重心補間モードでは、対応する非重心補間モードと同じ結果が生成されます。このシナリオでは、重心の概念は意味がありません。サンプル カバレッジは完全または 0 のみです。

保守的なラスター化では、縮退した三角形がピクセル シェーダー呼び出しを生成できるため、縮退する三角形では、すべての補間値に頂点 0 に割り当てられた値を使用する必要があります。

クリッピング操作

保守的ラスター化モードが有効で深度クリップが無効になっている場合 (DepthClipEnable ラスタライザーの状態が FALSE に設定されている場合)、実装によっては、プリミティブのセグメントが 0 <= z <= w の範囲外にある場合、属性補間に差異が生じる可能性があります。プリミティブが関連する平面と交差するポイント (ほぼ遠い) から定数値が使用されます。 または属性補間は、保守的なラスター化モードが無効な場合と同様に動作します。 ただし、深度値の動作は保守的なラスター化モードに関係なく同じです。つまり、深度範囲の範囲外にあるプリミティブには、ビューポートの深度範囲の最も近い制限の値を引き続き指定する必要があります。 0 <= z <= w 範囲内の属性補間動作は変更しない必要があります。

クリップ距離の相互作用

クリップ距離は、保守的なラスター化モードが有効な場合に有効であり、保守的にラスター化されたピクセルに対して動作します。保守的なラスター化がすべてのサンプルで有効になっていない場合と同様です。

保守的なラスター化では W 頂点座標の外挿が発生する可能性があり、W <= 0 が発生する可能性があることに注意してください。 これにより、ピクセル単位のクリップ距離の実装が、透視投影で無効な W 値で除算されたクリップ距離に対して動作する可能性があります。 クリップ距離の実装では、頂点座標 W <= 0 のピクセルに対してラスタライズを呼び出すのを防ぐ必要があります (たとえば、保守的なラスター化モードの場合の外挿のため)。

ターゲットの独立したラスター化の相互作用

保守的なラスター化モードは、ターゲットに依存しないラスター化 (TIR) と互換性があります。 すべてのサンプルがカバーされているかのように、保守的にラスター化されたピクセルに対して動作する、TIR ルールと制限が適用されます。

IA プリミティブ トポロジの相互作用

保守的なラスター化は、線または点のプリミティブには定義されていません。 したがって、ポイントまたはラインを指定するプリミティブ トポロジは、保守的なラスター化が有効になっているときにラスタライザー ユニットに供給される場合、未定義の動作を生成します。

デバッグ レイヤーの検証では、アプリケーションでこれらのプリミティブ トポロジが使用されていないことが確認されます。

クエリの対話

保守的にラスター化されたピクセルの場合、すべてのサンプルがカバーされている場合、保守的なラスター化が有効になっていない場合と同様にクエリが動作します。 たとえば、保守的にラスター化されたピクセルの場合、(D3D12_QUERY_TYPEから) D3D12_QUERY_TYPE_OCCLUSIONとD3D12_QUERY_TYPE_PIPELINE_STATISTICSは、すべてのサンプルがカバーされている場合に保守的なラスター化が有効になっていない場合と同様に動作する必要があります。

保守的なラスター化モードでは、保守的にラスター化されたすべてのピクセルに対してピクセル シェーダーの呼び出しをインクリメントする必要があります。

カリング状態の相互作用

すべてのカリング状態は保守的ラスター化モードで有効であり、保守的なラスター化が有効になっていない場合と同じ規則に従います。

解像度全体で保守的なラスター化をそれ自体と比較する場合、または保守的なラスター化が有効になっていない場合、一部のプリミティブで不一致の面 (つまり、一方の背面、もう一方の前面) が一致しない可能性があります。 アプリケーションでは、(D3D12_CULL_MODEから) D3D12_CULL_MODE_NONEを使用し、IsFrontFace システム生成値を使用しないことで、この不確定性を回避できます。

IsFrontFace の対話

IsFrontFace システム生成値は保守的ラスター化モードで使用できます。保守的なラスター化が有効でない場合に定義された動作に従います。

塗りつぶしモードの操作

保守的なラスター化に対して有効な D3D12_FILL_MODE はD3D12_FILL_SOLIDのみです。その他のフィル モードはラスタライザー状態の無効なパラメーターです。

これは、D3D12 機能仕様では、ワイヤーフレーム フィル モードで三角形のエッジをラインに変換し、ライン ラスタライズ ルールに従う必要があり、保守的なライン ラスタライズ動作が定義されていないためです。

実装の詳細

Direct3D 12 でサポートされるラスター化の種類は、"過大評価された保守的ラスター化" と呼ばれることもあります。 "過小評価された保守的なラスター化" という概念もあります。つまり、レンダリングされたプリミティブで完全にカバーされているピクセルのみがラスター化されます。 過小評価された保守的ラスター化情報は、入力カバレッジ データを使用してピクセル シェーダーを通じて利用でき、過大評価された保守的ラスター化のみがラスタライズ モードとして使用できます。

プリミティブの一部がピクセルと重なっている場合、そのピクセルはカバーされていると見なされ、ラスター化されます。 プリミティブのエッジまたはコーナーがピクセルのエッジまたはコーナーに沿って配置される場合、"左上のルール" の適用は実装固有です。 ただし、縮退する三角形をサポートする実装では、エッジまたはコーナーに沿って縮退する三角形が少なくとも 1 つのピクセルをカバーする必要があります。

保守的なラスター化の実装は、ハードウェアによって異なる場合があり、誤検知が発生する可能性があります。つまり、ピクセルがカバーされていると誤って判断する可能性があります。 これは、ラスター化で使用される固定小数点頂点座標に固有のプリミティブの増加やスナップ エラーなどの実装固有の詳細が原因で発生する可能性があります。 誤検知 (固定小数点頂点座標に関して) が有効な理由は、ある程度の誤検知が必要であるためです。これは、実装でポストスナップされた頂点 (つまり、ラスタライザーで使用される浮動小数点から 16.8 固定点に変換された頂点座標) に対してカバレッジ評価を行うために必要ですが、元の浮動小数点頂点座標によって生成されたカバレッジを考慮するためです。

保守的なラスター化の実装では、非縮退ポスト スナップ プリミティブの浮動小数点頂点座標に関して偽の負は生成されません。プリミティブのいずれかの部分がピクセルの一部と重なっている場合、そのピクセルはラスター化されます。

縮退された三角形 (インデックス バッファー内の重複するインデックスまたは 3D の共線) または固定小数点変換後に縮退する三角形 (ラスタライザー内の共線頂点) は、カリングされる場合と、カリングされない場合があります。どちらも有効な動作です。 逆三角形は逆向きと見なす必要があるため、アプリケーションで特定の動作が必要な場合は、背面カリングを使用したり、正面向きをテストしたりできます。 縮退三角形は、すべての補間値に頂点 0 に割り当てられた値を使用します。

ハードウェアでこの機能がサポートされない可能性に加えて、ハードウェアサポートには 3 つのレベルがあります。

  • 階層 1 では、最大 1/2 ピクセルの不確定領域が適用され、スナップ後の縮退はサポートされません。 これは、タイルレンダリング、テクスチャアトラス、ライトマップ生成、サブピクセルシャドウマップに適しています。
  • 階層 2 は、最大不確定領域を 1/256 に減らし、スナップ後の縮退をカリングしないようにする必要があります。 このレベルは、CPU ベースのアルゴリズム アクセラレーション (ボクセル化など) に役立ちます。
  • 階層 3 では、最大 1/256 の不確定領域が維持され、内部入力カバレッジのサポートが追加されます。 内部入力カバレッジは、高レベル シェーディング言語 (HLSL) に SV_InnerCoverage 新しい値を追加します。 これは、ピクセル シェーダーへの入力時に指定できる 32 ビットスカラー整数であり、過小評価された保守的なラスター化情報 (つまり、ピクセルが保証されているかどうか、to-be完全にカバーされる) を表します。 この層は、オクルージョン カリングに役立ちます。

API の概要

次のメソッド、構造体、列挙型、およびヘルパー クラスは、保守的なラスター化を参照します。

DirectX の高度な学習ビデオ チュートリアル: 保守的なラスター化

ラスタライザー順序付きビュー する

レンダリング