出力結合ステージ (Direct3D 10)

出力結合 (OM) ステージでは、パイプライン ステート、ピクセル シェーダーによって生成されたピクセル データ、レンダー ターゲットの内容、および深度/ステンシル バッファーの内容を組み合わせて使用することで、レンダリングされる最終的なピクセル カラーを生成します。OM ステージは、表示するピクセルの決定 (深度ステンシル テストによる) と最終的なピクセル カラーのブレンディングを行うための最後のステップです。

Direct3D 9 と Direct3D 10 の違い

Direct3D 9 では、出力レンダー ターゲットにピクセルを書き込むかどうかを制御するために、アルファ テストを実装しています (アルファ テスト ステートを使用します)。

Direct3D 10 では、アルファ テスト (またはアルファ テスト ステート) を実装していません。これを制御するには、ピクセル シェーダーまたは深度/ステンシル機能を使用します。

深度/ステンシル テストの概要

テクスチャー リソースとして作成される深度/ステンシル バッファーは、深度データとステンシル データの両方を格納できます。深度データは、カメラに最も近い位置に配置されたピクセルを特定するために使用され、ステンシル データは、更新可能なピクセルをマスクするために使用されます。最終的には、深度値とステンシル値のデータの両方が、ピクセルを描画する必要があるかどうかを決定するために出力結合ステージで使用されます。次のフロー チャートは、深度/ステンシル テストがどのように実行されるかを概念的に示したものです。

図形 1.  深度/ステンシル テストのブロック図

Ee415707.d3d10_depth_stencil_test(ja-jp,VS.85).gif

深度/ステンシル テストを構成する方法については、「深度/ステンシル機能の構成 (Direct3D 10)」を参照してください。深度/ステンシル オブジェクトは、深度/ステンシル ステートをカプセル化します。アプリケーションでは深度/ステンシル ステートを指定することができ、指定しない場合は、OM ステージでデフォルト値が使用されます。マルチサンプリングが無効な場合は、ピクセル単位でブレンディング処理が実行されます。マルチサンプリングが有効な場合は、マルチサンプル単位でブレンディングが実行されます。

深度バッファーを使用して描画するピクセルを決定する処理は、深度バッファーリングと呼ばれます。また、z バッファーリングと呼ばれることもあります。

(補間とピクセル シェーダーのどちらから送信されたかに関係なく) 深度値が出力結合ステージに到達すると、常に、浮動小数点ルールを使用して、深度バッファーのフォーマット/精度に従って z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) にクランプされます。クランプ後、深度値は、DepthFunc を使用して既存の深度バッファー値と比較されます。深度バッファーがバインドされていない場合は、常に深度テストに合格します。

深度バッファー フォーマットにステンシル成分がない場合、または深度バッファーがバインドされていない場合は、常にステンシル テストに合格します。これ以外の場合、機能は Direct3D 9 と変わりません。

一度にアクティブにすることができる深度/ステンシル バッファーは 1 つだけです。バインドされたリソース ビューは、深度/ステンシル ビューと一致していなければなりません (サイズと次元が同じでなければなりません)。これは、リソース サイズが一致していなければならないことを意味するものではなく、ビュー サイズが一致していればよいことを意味します。

深度ステンシルのテストの詳細については、「チュートリアル 14」を参照してください。

ブレンディングの概要

ブレンディングは、1 つまたは複数のピクセル値を結合して、最終的なピクセル カラーを作成します。次の概念図は、ピクセル データのブレンディングに関連するプロセスを示したものです。

図形 2.  ブレンディングのブロック図

Ee415707.d3d10_blend_state(ja-jp,VS.85).gif

概念的には、このフロー チャートが出力結合ステージで 2 回実行されると考えることができます。RGB データのブレンディングと、それと並行して実行されるアルファ データのブレンディングです。API を使用してブレンディング ステートを作成および設定する方法については、「ブレンディング機能の構成 (Direct3D 10)」を参照してください。

固定機能ブレンディングは、レンダー ターゲットごとに個別に有効にすることができます。ただし、ブレンディング制御は 1 組しかないため、ブレンディングが有効なすべての RenderTargets に同じブレンディングが適用されます。ブレンディング値 (BlendFactor を含む) は常に、ブレンディング前にレンダー ターゲット フォーマットの範囲にクランプされます。クランプは、レンダー ターゲット タイプを考慮して、レンダー ターゲットごとに実行されます。ただし、クランプされない float16、float11、および float10 フォーマットは例外で、これらのフォーマットのブレンディング処理は、少なくとも出力フォーマットと同じ精度/範囲で実行できます。NaN および符号付きのゼロは、すべての場合について伝搬されます (0.0 のブレンドの重みを含みます)。

Direct3D 9 と Direct3D 10 の違い

Direct3D 9 では、レンダー ターゲットごとに個別に固定機能ブレンディングを有効にすることができます。

Direct3D 10 には、ブレンディング ステートの記述が 1 つあります。そのため、すべてのレンダー ターゲットに 1 つのブレンディング値を設定できます。

デュアルソースのカラー ブレンディング

この機能を使用すると、出力結合ステージで、スロット 0 の 1 つのレンダー ターゲットを使用するブレンディング処理の入力として両方のピクセル シェーダー出力 (o0 および o1) を同時に使用することができます。有効なブレンディング処理には、加算、減算、および逆減算があります。SrcBlend、DestBlend、SrcBlendAlpha、または DestBlendAlpha の有効なブレンディング オプションとしては、D3D10_BLEND_SRC1COLOR、D3D10_BLEND_INVSRC1COLOR、D3D10_BLEND_SRC1ALPHA、および D3D10_BLEND_INVSRC1ALPHA があります。ブレンドの式および出力書き込みマスクによって、ピクセル シェーダーが出力する成分が指定されます。それ以外の成分は無視されます。

他のピクセル シェーダー出力 (o2、o3 など) への書き込みは定義されていません。スロット 0 にバインドされていない場合、レンダー ターゲットに書き込むことはできません。デュアル ソースのカラー ブレンディング時には、oDepth の書き込みは有効です。

例については、「ピクセル シェーダー出力のブレンディング」を参照してください。

複数のレンダー ターゲットの概要

1 つのピクセル シェーダーを使用して、少なくとも 8 つの別個のレンダー ターゲットにレンダリングすることができます。これらはすべて、同じタイプでなければなりません (バッファー、Texture1D、Texture1DArray など)。さらに、レンダー ターゲットはすべて、すべての次元 (幅、高さ、奥行き、配列のサイズ、サンプル カウント) でサイズが同じでなければなりません。各レンダー ターゲットでデータ フォーマットが異なっていてもかまいません。

レンダー ターゲット スロット (最大 8 つ) を任意の組み合わせで使用することができます。ただし、リソース ビューを複数のレンダー ターゲット スロットに同時にバインドすることはできません。複数のリソースが同時に使用されていない限り、ビューは再利用することができます。

出力書き込みマスクの概要

出力書き込みマスクは、レンダー ターゲットに書き込むことができるデータを (成分ごとに) 制御するために使用します。

サンプル マスクの概要

サンプル マスクは、アクティブなレンダー ターゲットで更新されるサンプルを決定する 32 ビットのマルチサンプリング カバレッジ マスクです。サンプル マスクは 1 つだけ使用できます。サンプル マスク内のビットからリソース内のサンプルへのマッピングは、ユーザーが定義します。n サンプル レンダリングの場合、サンプル マスクの (LSB から) 最初の n ビットが使用されます (最大ビット数は 32 ビットです)。

関連項目

パイプライン ステージ (Direct3D 10)