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