ラスター化ルール

ラスター化ルールは、ベクトル データをラスター データにマップする方法を定義します。 ラスター データは、整数値の位置に配置されてからカリングおよびクリッピングされ (描画するピクセルの数を最小限にするため)、ピクセル単位の属性が (頂点単位の属性から) 補間された後、ピクセル シェーダーに渡されます。

マップするプリミティブ タイプや、エイリアスを減らすためにデータでマルチサンプリングが使用されているかどうかに応じて、さまざまな種類のルールがあります。 次の図は、コーナーの処理方法を示したものです。

三角形のラスター化ルール (マルチサンプリングなし)

三角形の内部にあるピクセルの中心はすべて描画されます。左上ルールに適合すると、ピクセルは内部にあると見なされます。 左上ルールでは、ピクセルの中心が三角形の上のエッジまたは左のエッジにある場合に、三角形の内部にあると定義されます。

ここで、

  • 上のエッジは、完全に水平で、他のエッジよりも上にあるものです。
  • 左のエッジは、完全には水平でなく、三角形の左側にあるものです。三角形には、左のエッジが 1 つまたは 2 つあります。

左上ルールによって、隣接する三角形が一度に描画されます。

三角形の内側にある、または左上ルールに適合しているために描画されるピクセルの例を次の図に示します。

左上ルールに適合する三角形のラスター化の例

薄い灰色と濃い灰色はピクセルのグループです。ピクセルがどの三角形の内部にあるのかを示しています。

線のラスター化ルール (エイリアス、マルチサンプリングなし)

線のラスター化ルールでは、ひし形テスト領域を使用して、線がピクセルをカバーするかどうかを決定します。 x メジャー ライン (-1 <= 勾配<= +1 の線) の場合、ひし形テスト領域には、左下のエッジ、右下のエッジ、および下隅 (実線で表示) が含まれます。左上のエッジ、右上のエッジ、上隅、左隅、および右隅 (破線で表示) は除外されます。 y メジャー ラインは、x メジャー ライン以外の線です。ひし形テスト領域は x メジャー ラインについて説明したとおりですが、右隅も含まれる点が異なります。

ひし形領域で、線を始点から終点に沿って移動したときに、その線がピクセルのひし形テスト領域を抜けている場合、線はピクセルをカバーします。 ライン ストリップは、一連の線として描画されるので、同様に動作します。

次の図に、いくつかの例を示します。

エイリアスが適用された線のラスター化の例

線のラスター化ルール (アンチエイリアス、マルチサンプリングなし)

アンチエイリアスが適用された線は、矩形 (幅 = 1) のようにラスター化されます。 矩形は、ピクセル シェーダー出力のアルファ成分に乗算されるピクセル単位のカバレッジ値を生成するレンダー ターゲットと交差します。 マルチサンプリング レンダー ターゲットに線を描画する場合、アンチエイリアシングは実行されません。

アンチエイリアスが適用された線のレンダリングを実行する "最善" の方法は 1 つではないと考えられます。 Direct3D では、下の図に示されている方法をガイドラインとして採用します。 この方法は経験から導かれたもので、望ましいと思われるいくつかのビジュアル プロパティがあります。

ハードウェアがこのアルゴリズムに完全に一致する必要はありません。このリファレンスに対するテストには、下の方に記載されているいくつかの原則に従った "妥当" な許容範囲があり、さまざまなハードウェア実装やフィルター カーネル サイズが許容されます。 ただし、ハードウェアの実装で許容されるこの柔軟性は、単なる線の描画や外観の確認/評価を超えるものであり、Direct3D を通じてアプリケーションに伝達することはできません。

アンチエイリアスが適用された線のラスター化の例

このアルゴリズムでは、インテンシティが均一で、エッジのギザギザやブレーディングが最小限に抑えられた、比較的滑らかな線が生成されます。 接近した線のモアレ パターンは最小限に抑えられます。 端と端が接している線分間の区切りも適切にカバーされます。

フィルター カーネルは、エッジのぼかしの量とガンマ修正によって生じる強度の変化との適正なトレードオフです。 カバレッジ値は、出力結合 (OM) ステージで次の式によってピクセル シェーダーの o0.a (srcAlpha) に乗算されます。

srcColor * srcAlpha + destColor * (1-srcAlpha)

点のラスター化ルール (マルチサンプリングなし)

点は、三角形のラスター化ルールを使用する Z パターンの 2 つの三角形で構成されているものとして解釈されます。 座標は、1 つのピクセル幅の正方形の中心を示します。 点のカリングはありません。

次の図に、いくつかの例を示します。

点のラスター化の例

マルチサンプル アンチエイリアシングのラスター化ルール

マルチサンプル アンチエイリアシング (MSAA) は、複数のサブサンプリング位置でピクセルのカバレッジおよび深度/ステンシル テストを使用してジオメトリのエイリアスを低減します。 パフォーマンスを向上させるために、カバーされたサブピクセル間でシェーダー出力を共有することで、カバーされたピクセルごとに 1 回ずつピクセル単位の計算が実行されます。 マルチサンプル アンチエイリアシングでは、サーフェスのエイリアスは低減されません。 サンプリング位置や再構築関数は、ハードウェアの実装によって異なります。

次の図に、いくつかの例を示します。

マルチサンプル アンチエイリアスのラスター化の例

サンプリング位置の数は、マルチサンプル モードによって異なります。 頂点属性は、ピクセルの中心で補間されます。この場所で、ピクセル シェーダーが呼び出されるためです (中心がカバーされていない場合は補外になります)。 重心でサンプリングされるように、ピクセル シェーダー内で属性にフラグを設定できます。これにより、カバーされていないピクセルで、ピクセルの領域とプリミティブの交点で属性が補間されます。

(x と y のデルタを使用する) 微分計算をサポートするために、2x2 のピクセル領域ごとにピクセル シェーダーが実行されます。 これは、示されているよりも多くのシェーダーの呼び出しが発生すれば、2x2 の最小クォンタムが満たされることを意味します (マルチサンプリングには依存しません)。 シェーダーの結果は、サンプル単位の深度/ステンシル テストに合格した、カバーされている各サンプルについて書き出されます。

通常、プリミティブのラスター化ルールは、以下の場合を除きマルチサンプル アンチエイリアシングによって変わりません。

  • 三角形の場合、ピクセルの中心ではなく、各サンプリング位置に対してカバレッジ テストが実行されます。 複数のサンプリング位置がカバーされている場合、ピクセル シェーダーは、ピクセルの中心で補間された属性によって 1 回実行されます。 結果は、カバーされているサンプリング位置ごとに、深度/ステンシル テストに合格したピクセルに格納 (複製) されます。

    線は、線幅 1.4 の 2 つの三角形で構成された矩形として処理されます。

  • 点の場合、ピクセルの中心ではなく、各サンプリング位置に対してカバレッジ テストが実行されます。

マルチサンプリング フォーマットは、「Load」を使用してシェーダーに読み戻すことができるレンダー ターゲットで使用することができます。これは、シェーダーがアクセスする個々のサンプルには解決が不要なためです。 深度フォーマットは、マルチサンプル リソースではサポートされていないため、レンダー ターゲットのみに制限されます。

型なしフォーマットではマルチサンプリングがサポートされており、リソース ビューで異なる方法でデータを解釈できます。 たとえば、R8G8B8A8_TYPELESS を使用してマルチサンプル リソースを作成し、レンダー ターゲット ビュー リソースを使用して R8G8B8A8_UINT フォーマットでマルチサンプル リソースにレンダリングして、R8G8B8A8_UNORM データ フォーマットで内容を別のリソースに解決することができます。

ハードウェア サポート

API は、品質レベルの数によってマルチサンプリングのハードウェア サポートをレポートします。 たとえば、品質レベルが 0 の場合、ハードウェアにおいて (特定のフォーマットおよび品質レベルで) マルチサンプリングがサポートされていないことを意味します。 品質レベルが 3 の場合は、ハードウェアで 3 つの異なるサンプル レイアウトや解決アルゴリズムがサポートされていることを意味します。 次のように仮定することもできます。

  • マルチサンプリングをサポートするフォーマットは、同じファミリー内のすべてのフォーマットについて同じ数の品質レベルをサポートします。
  • マルチサンプリングをサポートし、_UNORM、_SRGB、_SNORM、または _FLOAT フォーマットがあるフォーマットはすべて、解決もサポートします。

マルチサンプル アンチエイリアシング時の属性の重心サンプリング

既定では、頂点属性は、マルチサンプル アンチエイリアシング時にピクセルの中心に補間されます。ピクセルの中心がカバーされていない場合、属性はピクセルの中心に対して補外されます。 (ピクセルが完全にはカバーされていないと仮定すると) 重心セマンティクスを含むピクセル シェーダー入力は、ピクセルのカバーされている領域内のいずれかの場所、おそらく、カバーされたサンプリング位置のいずれかでサンプリングされます。 サンプル マスク (ラスタライザー ステートで指定) は、重心計算の前に適用されます。 そのため、マスク アウトされたサンプルは重心位置として使用されません。

リファレンス ラスタライザーは、これと似たような方法で、重心サンプリングのサンプリング位置を選択します。

  • サンプル マスクは、すべてのサンプルに指定可能です。 ピクセルがカバーされている場合、またはいずれのサンプルもカバーされていない場合は、ピクセルの中心を使用します。 それ以外の場合は、カバーされている最初のサンプルが選択され、ピクセルの中心から始まって外側に移動していきます。
  • サンプル マスクは、1 つを除くすべてのサンプルをオフにします (一般的なシナリオ)。 アプリケーションでは、1 ビットのサンプル マスク値を順番に繰り返し、重心サンプリングを使用してサンプルごとにシーンを再レンダリングすることで、マルチパス スーパーサンプリングを実装できます。 このためには、より詳細なテクスチャー ミップを適切に選択して、より高いテクスチャー サンプリング密度を実現できるように、アプリケーションで微分を調整することが必要です。

マルチサンプリング時の微分計算

ピクセル シェーダーは、微分計算 (隣接したピクセルのデータ間のデルタを取得して計算する) をサポートするために、常に 2x2 以上のピクセル領域を使用して実行されます (各ピクセル内のデータが、水平方向または垂直方向に単位間隔でサンプリングされていると仮定します)。 これは、マルチサンプリングに影響されることはありません。

重心サンプリングされた属性に対して微分が要求された場合、ハードウェア計算が調整されず、微分が不正確になることがあります。 シェーダーは、レンダー ターゲット空間の単位ベクトルを予測しますが、他のベクトル空間に関する非単位ベクトルを取得する場合があります。 したがって、重心サンプリングされた属性から微分の要求があった場合には、アプリケーション側で警告を発行する必要があります。

実際には、微分と重心サンプリングを組み合わせないことをお勧めします。 プリミティブの補間された属性が、補外されないことが重要である状況で、重心サンプリングが役立つ場合があります。ただし、これには、プリミティブのエッジがピクセルを横切る位置を (連続して変更するのではなく) ジャンプするような属性や、LOD を算出するテクスチャー サンプリング処理で使用できない微分などのトレードオフが伴います。

付録

ラスタライザー (RS) ステージ