次の方法で共有


Output-Merger ステージ

出力マージャー (OM) ステージでは、パイプライン状態、ピクセル シェーダーによって生成されたピクセル データ、レンダー ターゲットの内容、深度/ステンシル バッファーの内容の組み合わせを使用して、最終的なレンダリングされたピクセル カラーが生成されます。 OM ステージは、どのピクセルが表示されているか (深度ステンシル テストを使用) を決定し、最終的なピクセル カラーをブレンドするための最後の手順です。

Direct3D 9 と Direct3D 10 の違い:

  • Direct3D 9 では、アルファ テスト (アルファ テスト状態を使用) を実装して、ピクセルが出力レンダー ターゲットに書き込まれるかどうかを制御します。
  • Direct3D 10 以降では、アルファ テスト (またはアルファ テスト状態) は実装されません。 これは、ピクセル シェーダーまたは深度/ステンシル機能を使用して制御できます。

Depth-Stencil テストの概要

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

深度ステンシル テストのしくみの図

深度ステンシル テストを構成するには、「Depth-Stencil 機能の構成 を参照してください。 深度ステンシル オブジェクトは、深度ステンシルの状態をカプセル化します。 アプリケーションで深度ステンシルの状態を指定することも、OM ステージで既定値を使用することもできます。 マルチサンプリングが無効になっている場合、ブレンド操作はピクセル単位で実行されます。 マルチサンプリングが有効になっている場合、ブレンドはマルチサンプルごとに行われます。

深度バッファーを使用して描画するピクセルを決定するプロセスは、深度バッファリングと呼ばれ、z バッファリングとも呼ばれます。

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

深度バッファー形式のステンシル コンポーネントがない場合、または深度バッファーがバインドされていない場合、ステンシル テストは常に合格します。 それ以外の場合、機能は Direct3D 9 から変更されません。

一度にアクティブにできる深度/ステンシル バッファーは 1 つだけです。バインドされたリソース ビューは、深度/ステンシル ビューと一致する必要があります (同じサイズとディメンション)。 これは、リソース サイズが一致する必要があることを意味するわけではありません。ビュー サイズが一致する必要があるだけです。

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

ブレンドの概要

ブレンドでは、1 つ以上のピクセル値を組み合わせて最終的なピクセルカラーを作成します。 次の図は、ピクセル データのブレンドに関連するプロセスを示しています。

データのブレンドのしくみの図

概念的には、出力合併ステージで 2 回実装されたこのフロー チャートを視覚化できます。1 つ目は RGB データをブレンドし、2 つ目はアルファ データをブレンドします。 API を使用してブレンド状態を作成および設定する方法については、「ブレンド機能の構成 」を参照してください。

固定関数ブレンドは、レンダー ターゲットごとに個別に有効にすることができます。 ただし、ブレンド コントロールのセットは 1 つだけであるため、ブレンドが有効になっているすべての RenderTarget に同じブレンドが適用されます。 ブレンド値 (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、または DestBlendAlpha の有効なブレンド オプションには、D3D11_BLEND_SRC1_COLORD3D11_BLEND_INV_SRC1_COLORD3D11_BLEND_SRC1_ALPHAD3D11_BLEND_INV_SRC1_ALPHAが含まれます。 ブレンド方程式と出力書き込みマスクは、ピクセル シェーダーが出力するコンポーネントを指定します。 追加のコンポーネントは無視されます。

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

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

複数の RenderTargets の概要

ピクセル シェーダーを使用して、少なくとも 8 つの個別のレンダー ターゲットにレンダリングできます。これらはすべて同じ種類 (バッファー、Texture1D、Texture1DArray など) である必要があります。 さらに、すべてのレンダー ターゲットは、すべての次元 (幅、高さ、深度、配列サイズ、サンプル数) で同じサイズにする必要があります。 各レンダー ターゲットのデータ形式は異なる場合があります。

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

Output-Write マスクの概要

出力/書き込みマスクを使用して、レンダー ターゲットに書き込むことができるデータを (コンポーネントごとに) 制御します。

サンプル マスクの概要

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

このセクションでは、次の操作を行います。

話題 形容
Depth-Stencil 機能の構成
このセクションでは、出力マージャー ステージの深度ステンシル バッファーと深度ステンシル状態を設定する手順について説明します。
ブレンド機能 を構成する
ブレンド操作は、出力値がレンダー ターゲットに書き込まれる前に、すべてのピクセル シェーダー出力 (RGBA 値) に対して実行されます。 マルチサンプリングが有効になっている場合、ブレンドは各マルチサンプルで行われます。それ以外の場合は、各ピクセルにブレンドが実行されます。
深度バイアス
3D 空間で同一平面上にある多角形は、それぞれに z バイアス (または深度バイアス) を追加することで、同一平面上にないかのように表示できます。

グラフィックス パイプラインの

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