出力結合 (OM) ステージ
出力マージャー (OM) ステージでは、パイプライン状態、ピクセル シェーダーによって生成されたピクセル データ、レンダー ターゲットのコンテンツ、深度/ステンシル バッファーの内容の組み合わせを使用して、最終的なレンダリングピクセルカラーが生成されます。 OM ステージは、(深度ステンシル テストを使用して) 表示されるピクセルを決定し、最終的なピクセルの色をブレンドするための最後の手順です。
Direct3D 9 と Direct3D 10 の違い:
- Direct3D 9 では、アルファ テスト ( アルファ テスト状態を使用) を実装して、ピクセルが出力レンダー ターゲットに書き込まれるかどうかを制御します。
- Direct3D 10 以降では、アルファ テスト (またはアルファ テスト状態) は実装されません。 これは、ピクセル シェーダーまたは深度/ステンシル機能を使用して制御できます。
Depth-Stencil テストの概要
テクスチャ リソースとして作成される深度/ステンシル バッファーは、深度データとステンシル データの両方を格納できます。 深度データは、カメラに最も近い位置に配置されたピクセルを特定するために使用され、ステンシル データは、更新可能なピクセルをマスクするために使用されます。 最終的には、深度値とステンシル値のデータの両方が、ピクセルを描画する必要があるかどうかを決定するために出力結合 (OM) ステージで使用されます。 次の図は、深度/ステンシル テストがどのように実行されるかを概念的に示したものです。
深度/ステンシル テストを構成する方法については、「深度/ステンシル機能の構成」を参照してください。 深度/ステンシル オブジェクトは、深度/ステンシル ステートをカプセル化します。 アプリケーションでは深度/ステンシル ステートを指定することができ、指定しない場合は、OM ステージでデフォルト値が使用されます。 マルチサンプリングが無効な場合は、ピクセル単位でブレンディング処理が実行されます。 マルチサンプリングが有効な場合は、マルチサンプル単位でブレンディングが実行されます。
深度バッファーを使用して描画するピクセルを決定する処理は、深度バッファーリングと呼ばれます。また、z バッファーリングと呼ばれることもあります。
(補間とピクセル シェーダーのどちらから送信されたかに関係なく) 深度値が出力結合 (OM) ステージに到達すると、常に、浮動小数点ルールを使用して、深度バッファーのフォーマット/精度に従って z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) にクランプされます。 クランプ後、深度値は、DepthFunc を使用して既存の深度バッファー値と比較されます。 深度バッファーがバインドされていない場合は、常に深度テストに合格します。
深度バッファー フォーマットにステンシル成分がない場合、または深度バッファーがバインドされていない場合は、常にステンシル テストに合格します。 それ以外の場合、機能は Direct3D 9 から変更されません。
一度にアクティブにすることができる深度/ステンシル バッファーは 1 つだけです。バインドされたリソース ビューは、深度/ステンシル ビューと一致していなければなりません (サイズと次元が同じでなければなりません)。 これは、リソース サイズが一致していなければならないことを意味するものではなく、ビュー サイズが一致していればよいことを意味します。
深度ステンシル テストの詳細については、 チュートリアル 14 を参照してください。
ブレンドの概要
ブレンディングは、1 つまたは複数のピクセル値を結合して、最終的なピクセル カラーを作成します。 次の図は、ピクセル データのブレンディングに関連するプロセスを示したものです。
概念的には、出力合併ステージで 2 回実装されたこのフローチャートを視覚化できます。1 つ目は RGB データをブレンドし、2 つ目はアルファ データをブレンドします。 API を使用してブレンディング ステートを作成および設定する方法については「ブレンド機能の構成」を参照してください。
固定機能ブレンディングは、レンダー ターゲットごとに個別に有効にすることができます。 ただし、ブレンディング制御は 1 組しかないため、ブレンディングが有効なすべての RenderTargets に同じブレンディングが適用されます。 ブレンディング値 (BlendFactor を含む) は常に、ブレンディング前にレンダー ターゲット フォーマットの範囲にクランプされます。 クランプは、レンダー ターゲット タイプを考慮して、レンダー ターゲットごとに実行されます。 ただし、クランプされない float16、float11、および float10 フォーマットは例外で、これらのフォーマットのブレンディング処理は、少なくとも出力フォーマットと同じ精度/範囲で実行できます。 NaN および符号付きのゼロは、すべての場合について伝搬されます (0.0 のブレンドの重みを含みます)。
sRGB レンダー ターゲットを使用する際、ランタイムはブレンディングを実行する前にレンダー ターゲットの色を線形空間に変換します。 ランタイムは、レンダー ターゲットに値を保存する前に、最終的なブレンドされた値をsRGB 空間に変換します。
Direct3D 9 と Direct3D 10 の違い:
- Direct3D 9 では、固定関数ブレンドをレンダー ターゲットごとに個別に有効にすることができます。
- Direct3D 10 以降では、ブレンド状態の説明が 1 つあります。したがって、すべてのレンダー ターゲットに対して 1 つのブレンド値を設定できます。
Dual-Source カラー ブレンド
この機能により、出力マージ ステージでは、スロット 0 の単一レンダー ターゲットを使用したブレンド操作への入力として、ピクセル シェーダー出力 (o0 と o1) の両方を同時に使用できます。 有効なブレンディング処理には、加算、減算、および逆減算があります。 SrcBlend、DestBlend、SrcBlendAlpha、または DestBlendAlpha の有効なブレンド オプションには、 D3D11_BLEND_SRC1_COLOR、 D3D11_BLEND_INV_SRC1_COLOR、 D3D11_BLEND_SRC1_ALPHA、 D3D11_BLEND_INV_SRC1_ALPHAが含まれます。 ブレンドの式および出力書き込みマスクによって、ピクセル シェーダーが出力する成分が指定されます。 それ以外の成分は無視されます。
他のピクセル シェーダー出力 (o2、o3 など) への書き込みは定義されていません。スロット 0 にバインドされていない場合、レンダー ターゲットに書き込むことはできません。 デュアル ソースのカラー ブレンディング時には、oDepth の書き込みは有効です。
例については、「 ピクセル シェーダー出力のブレンド」を参照してください。
複数の RenderTargets の概要
1 つのピクセル シェーダーを使用して、少なくとも 8 つの別個のレンダー ターゲットにレンダリングすることができます。これらはすべて、同じタイプでなければなりません (バッファー、Texture1D、Texture1DArray など)。 さらに、レンダー ターゲットはすべて、すべての次元 (幅、高さ、奥行き、配列のサイズ、サンプル カウント) でサイズが同じでなければなりません。 各レンダー ターゲットでデータ フォーマットが異なっていてもかまいません。
レンダー ターゲット スロット (最大 8 つ) を任意の組み合わせで使用することができます。 ただし、リソース ビューを複数のレンダー ターゲット スロットに同時にバインドすることはできません。 複数のリソースが同時に使用されていない限り、ビューは再利用することができます。
Output-Write マスクの概要
出力書き込みマスクは、レンダー ターゲットに書き込むことができるデータを (成分ごとに) 制御するために使用します。
マスクのサンプルの概要
サンプル マスクは、アクティブなレンダー ターゲットで更新されるサンプルを決定する 32 ビットのマルチサンプリング カバレッジ マスクです。 サンプル マスクは 1 つだけ使用できます。 サンプル マスク内のビットからリソース内のサンプルへのマッピングは、ユーザーが定義します。 n サンプル レンダリングの場合、サンプル マスクの (LSB から) 最初の n ビットが使用されます (最大ビット数は 32 ビットです)。
このセクションの内容
トピック | 説明 |
---|---|
Depth-Stencil機能の構成 |
ここでは、出力結合 (OM) ステージの深度/ステンシル バッファーと深度/ステンシル ステートを設定する手順について説明します。 |
ブレンド機能の構成 |
ブレンド操作は、出力値がレンダー ターゲットに書き込まれる前に、すべてのピクセル シェーダー出力 (RGBA 値) で実行されます。 マルチサンプリングが有効になっている場合、ブレンドは各マルチサンプリングで行われます。それ以外の場合は、各ピクセルに対してブレンドが実行されます。 |
深度バイアス |
3D 空間内で同一平面上にあるポリゴンは、それぞれに z バイアス (深度バイアス) を追加することで、同一平面ではないかのように表示できます。 |