次の方法で共有


ラスター化ルール

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

複数の種類のルールがあります。これは、マップされるプリミティブの種類と、データがマルチサンプリングを使用してエイリアスを減らすかどうかによって異なります。 次の図は、コーナー ケースの処理方法を示しています。

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

三角形の内側にあるピクセルの中心が描画されます。左上のルールに合格した場合、ピクセルは内側にあると見なされます。 左上のルールは、ピクセルの中心が三角形の上端または三角形の左端にある場合に、三角形の内側に配置するように定義されます。

どこ:

  • 上端は、正確に水平で、もう一方のエッジの上にあるエッジです。
  • 左端は、正確には水平ではなく、三角形の左側にあるエッジです。 三角形には、1 つまたは 2 つの左端を含めることができます。

左上のルールにより、隣接する三角形が 1 回描画されます。

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

左上の三角形ラスター化の例の図

ピクセルの明るい灰色と濃い灰色のカバーは、中にある三角形を示すピクセルのグループとして表示されます。

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

線のラスター化ルールでは、ひし形のテスト領域を使用して、線がピクセルを覆うかどうかを判断します。 x 線 (-1 <= 傾き <= +1 の線) の場合、ひし形のテスト領域には、左下エッジ、右下エッジ、および下端が含まれます (実線を示します)。ひし形は、左上隅、右上隅、上端、左上隅、および右隅を除きます (点線で示されています)。 y-major 線は、x-major 行ではない任意の行です。テストダイヤモンドエリアは、右隅も含まれている点を除き、x線の説明と同じです。

ダイヤモンド領域を指定すると、線が始点から終点に向かって直線に沿って進むときに、その線がピクセルのダイヤモンドテスト領域を終了した場合、線はピクセルを覆います。 ライン ストリップは、一連の線として描画される場合と同じように動作します。

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

エイリアス化された線のラスター化の例の 図

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

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

アンチエイリアシングされたライン レンダリングを実行するための単一の "最適な" 方法はないと見なされます。 Direct3D 10 は、次の図に示す方法をガイドラインとして採用しています。 この方法は経験的に導き出され、望ましいと考えられる多くの視覚的特性を示した。 ハードウェアはこのアルゴリズムと完全に一致する必要はありません。このリファレンスに対するテストには、以下に示す一部の原則に従って"妥当な" 許容度が設定され、さまざまなハードウェア実装とフィルター カーネル サイズが許可されます。 ただし、ハードウェア実装では、この柔軟性のいずれも Direct3D 10 を介してアプリケーションに伝達することはできません。これは、線を描画したり、見た目を観察/測定したりするだけでなくです。

アンチエイリアシングされたライン ラスタライズの例の 図

このアルゴリズムは、最小限のジャグエッジまたは編組で、均一な強度で比較的滑らかなラインを生成します。 近い線のモアレ パターンが最小限に抑えられます。 エンド ツー エンドで配置されたライン セグメント間のジャンクションには、適切なカバレッジがあります。 フィルター カーネルは、エッジのぼかしの量とガンマ補正による強度の変化との間の妥当なトレードオフです。 カバレッジ値は、出力マージャー ステージによって次の数式に従ってピクセル シェーダー o0.a (srcAlpha) に乗算されます: srcColor * srcAlpha + destColor * (1-srcAlpha)。

ポイント ラスター化ルール (マルチサンプリングなし)

ポイントは、Z パターン内の 2 つの三角形で構成されているかのように解釈され、三角形のラスター化ルールが使用されます。 座標は、1 ピクセル幅の正方形の中心を識別します。 ポイントのカリングはありません。

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

ポイントラスタライズ図

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

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

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

マルチサンプル アンチエイリアシングの図

サンプルの場所の数は、マルチサンプル モードによって異なります。 頂点属性はピクセル の中心で補間されます。これはピクセル シェーダーが呼び出される場所であるためです (中心がカバーされていない場合、これは外挿になります)。 ピクセル シェーダーの属性に重心サンプリングのフラグを設定できます。これにより、カバーされていないピクセルによって、ピクセルの領域とプリミティブの交差部分で属性が補間されます。 ピクセル シェーダーは、2x2 ピクセル領域ごとに実行され、派生計算 (x と y のデルタを使用) をサポートします。 つまり、シェーダー呼び出しは、(マルチサンプリングとは無関係に) 最小 2x2 quanta を入力するために示されている以上に発生します。 シェーダーの結果は、サンプルごとの深度ステンシル テストに合格する対象となるサンプルごとに書き出されます。

プリミティブのラスター化ルールは、一般に、マルチサンプル アンチエイリアシングによって変更されません。ただし、次の点を除く。

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

    線は 2 つの三角形で構成される四角形として扱われ、線の幅は 1.4 です。

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

多くの形式ではマルチサンプリングがサポートされています (「Hardware Support for Direct3D 10 Formats」を参照)、一部の形式を解決できます (ResolveSubresource。マルチサンプリング形式をサンプル サイズ 1 にダウンサンプリングします)。 マルチサンプリング形式はレンダー ターゲットで使用でき、ロードを使用してシェーダーに読み込むことができます。シェーダーがアクセスする個々のサンプルに解決は必要ないためです。 深度形式はマルチサンプル リソースではサポートされていないため、深度形式はレンダー ターゲットのみに制限されます。

型指定なしの形式 (たとえばR8G8B8A8_TYPELESS) では、マルチサンプリングがサポートされ、リソース ビューでさまざまな方法でデータを解釈できます。 たとえば、R8G8B8A8_TYPELESSを使用してマルチサンプル リソースを作成し、R8G8B8A8_UINT形式のレンダー ターゲット ビュー リソースを使用してそのリソースにレンダリングした後、R8G8B8A8_UNORMデータ形式でコンテンツを別のリソースに解決できます。

ハードウェアサポート

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

  • マルチサンプリングをサポートする任意の形式では、そのファミリ内のすべての形式で同じ数の品質レベルがサポートされます。
  • マルチサンプリングをサポートし、_UNORM、_SRGB、_SNORM、または_FLOAT形式を持つすべての形式でも、解決がサポートされます。

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

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

参照ラスタライザーは、次のような重心サンプリングのサンプル位置を選択します。

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

マルチサンプリング時の派生計算

ピクセル シェーダーは、常に最小 2 x 2 ピクセルの領域を使用して実行され、派生計算をサポートします。これは、隣接するピクセルからデータ間の差分を取ることによって計算されます (各ピクセル内のデータが単位間隔で水平方向または垂直方向にサンプリングされていることを前提としています)。 これはマルチサンプリングの影響を受けません。

重心サンプリングされた属性に対して派生物が要求された場合、ハードウェア計算は調整されず、派生物が不正確になる可能性があります。 シェーダーはレンダー ターゲット空間で単位ベクトルを期待しますが、他のベクター空間に対して非ユニット ベクターを取得する場合があります。 したがって、重心サンプリングされる属性から派生物を要求する場合は、アプリケーションが注意を払う必要があります。 実際には、誘導体と重心サンプリングを組み合わせないことをお勧めします。 重心サンプリングは、プリミティブの補間された属性が外挿されないことが重要な状況に役立ちますが、これには、プリミティブ エッジが (継続的に変化するのではなく) ピクセルを横切るようにジャンプするように見える属性や、LOD を派生させるテクスチャ サンプリング操作で使用できない派生物などのトレードオフが伴います。

ラスタライザー ステージ