Direct3D 11.3 保守的なラスター化
保守的なラスター化は、ピクセル レンダリングに確実性を追加します。これは、特に衝突検出アルゴリズムに役立ちます。
概要
保守的なラスター化とは、レンダリングされたプリミティブによって少なくとも部分的にカバーされているすべてのピクセルがラスタライズされることを意味します。つまり、ピクセル シェーダーが呼び出されます。 通常の動作はサンプリングであり、保守的なラスター化が有効になっている場合は使用されません。
保守的なラスター化は、衝突検出、オクルージョン カリング、可視性検出の確実性など、さまざまな状況で役立ちます。
たとえば、次の図は、保守的なラスター化を使用してレンダリングされた緑色の三角形を示しています。 茶色の領域は「不確定領域」と呼ばれ、丸め誤差やその他の問題が三角形の正確な寸法に不確実性を加える領域です。 各頂点の赤い三角形は、不確定領域がどのように計算されるかを示しています。 大きな灰色の四角形には、レンダリングされるピクセルが表示されます。 ピンクの四角形は、三角形の端がピクセルの端を横切ると再生される"左上のルール"を使用してレンダリングされたピクセルを示しています。 システムが通常は実行するが、常にカリングするとは限らない誤検知 (設定されていないピクセル) が存在する可能性があります。
左上のルール
パイプラインとの対話
保守的なラスター化とグラフィックス パイプラインの相互作用の詳細については、D3D12 保守的なラスター化を参照してください。
実装の詳細
Direct3D 12 でサポートされるラスター化の種類は、"過大評価された保守的なラスター化" と呼ばれることもあります。 また、"過小評価された保守的なラスター化" という概念もあります。つまり、レンダリングされたプリミティブで完全にカバーされているピクセルのみがラスター化されます。 過小評価された保守的なラスター化情報は、入力カバレッジ データを使用してピクセル シェーダーを通じて使用でき、過大評価された保守的なラスター化のみがラスタライズ モードとして使用できます。
プリミティブの一部がピクセルと重なっている場合、そのピクセルはカバーされていると見なされ、ラスター化されます。 プリミティブのエッジまたはコーナーがピクセルのエッジまたはコーナーに沿って配置される場合、"左上のルール" の適用は実装固有です。 ただし、縮退する三角形をサポートする実装では、エッジまたはコーナーに沿って縮退する三角形が少なくとも 1 つのピクセルをカバーする必要があります。
保守的なラスター化の実装は、ハードウェアによって異なる場合があり、誤検知が発生する可能性があります。つまり、ピクセルがカバーされていると誤って判断する可能性があります。 これは、ラスター化で使用される固定小数点頂点座標に固有のプリミティブの増加やスナップ エラーなどの実装固有の詳細が原因で発生する可能性があります。 誤検知 (固定小数点頂点座標に関して) が有効な理由は、ある程度の誤検知が必要であるためです。これは、実装でポストスナップされた頂点 (つまり、ラスタライザーで使用される浮動小数点から 16.8 固定点に変換された頂点座標) に対してカバレッジ評価を行うために必要ですが、元の浮動小数点頂点座標によって生成されたカバレッジを考慮するためです。
保守的なラスター化の実装では、非縮退ポスト スナップ プリミティブの浮動小数点頂点座標に関して偽の負は生成されません。プリミティブのいずれかの部分がピクセルの一部と重なっている場合、そのピクセルはラスター化されます。
縮退された三角形 (インデックス バッファー内の重複するインデックスまたは 3D の共線) または固定小数点変換後に縮退する三角形 (ラスタライザー内の共線頂点) は、カリングされる場合と、カリングされない場合があります。どちらも有効な動作です。 逆三角形は逆向きと見なす必要があるため、アプリケーションで特定の動作が必要な場合は、背面カリングを使用したり、正面向きをテストしたりできます。 縮退三角形は、すべての補間値に頂点 0 に割り当てられた値を使用します。
ハードウェアでこの機能がサポートされない可能性に加えて、ハードウェアサポートには 3 つのレベルがあります。
- 階層 1 では、1/2 ピクセルの不確定領域がサポートされており、スナップ後の縮退はありません。 これは、タイルレンダリング、テクスチャアトラス、ライトマップ生成、サブピクセルシャドウマップに適しています。
- 階層 2 では、スナップ後の縮退が追加され、1/256 の不確定領域が追加されます。 また、CPU ベースのアルゴリズム アクセラレーション (ボクセル化など) のサポートも追加されます。
- 階層 3 では、1/512 の不確定領域、内部入力カバレッジが追加され、オクルージョン カリングがサポートされます。 入力カバレッジにより、高レベル シェーディング言語 (HLSL) に新しい値
SV_InnerCoverage
が追加されます。 これは、ピクセル シェーダーへの入力時に指定できる 32 ビットのスカラー整数であり、過小評価された保守的なラスター化情報 (つまり、ピクセルが保証されているかどうか、to-be完全にカバーされる) を表します。
API の概要
次のメソッド、構造体、列挙型、ヘルパー クラスは、保守的なラスター化を参照します。
- D3D11_RASTERIZER_DESC2: ラスタライザーの説明を作成するためのCD3D12_RASTERIZER_DESC2 ヘルパー クラスを示す、ラスタライザーの説明を保持する構造体。
- D3D11_CONSERVATIVE_RASTERIZATION_MODE: モードの列挙値 (オンまたはオフ)。
- D3D11_FEATURE_DATA_D3D11_OPTIONS2: サポート層を保持する構造。
- D3D11_CONSERVATIVE_RASTERIZATION_TIER: ハードウェアによるサポートレベルごとの列挙値。
- ID3D11Device::CheckFeatureSupport: サポートされている機能にアクセスするためのメソッド。