出力マージャー (OM) ステージOutput Merger (OM) stage

出力マージャー (OM) ステージでは、各種出力データ (ピクセル シェーダー値、深度とステンシルの情報) をレンダー ターゲットおよび深度/ステンシル バッファーの内容と結合し、最終的なパイプラインの結果を生成します。The Output Merger (OM) stage combines various types of output data (pixel shader values, depth and stencil information) with the contents of the render target and depth/stencil buffers to generate the final pipeline result.

目的と使用Purpose and uses

出力マージャー (OM) ステージは、表示するピクセルの決定 (深度ステンシル テストによる) と最終的なピクセル カラーのブレンディングを行うための最後のステップです。The Output Merger (OM) stage is the final step for determining which pixels are visible (with depth-stencil testing) and blending the final pixel colors.

OM ステージでは、次のものを組み合わせて使用することで、レンダリングされる最終的なピクセル カラーを生成します。The OM stage generates the final rendered pixel color using a combination of the following:

  • パイプライン ステートPipeline state
  • ピクセル シェーダーによって生成されたピクセル データThe pixel data generated by the pixel shaders
  • レンダー ターゲットの内容The contents of the render targets
  • 深度/ステンシル バッファーの内容The contents of the depth/stencil buffers.

描画の概要Blending overview

ブレンディングは、1 つまたは複数のピクセル値を結合して、最終的なピクセル カラーを作成します。Blending combines one or more pixel values to create a final pixel color. 次の図は、ピクセル データのブレンディングに関連するプロセスを示したものです。The following diagram shows the process involved in blending pixel data.

データのブレンディングのしくみ

概念的には、このフロー チャートが出力結合 (OM) ステージで 2 回実行されると考えることができます。RGB データのブレンディングと、それと並行して実行されるアルファ データのブレンディングです。Conceptually, you can visualize this flow chart implemented twice in the Output Merger stage: the first one blends RGB data, while in parallel, a second one blends alpha data. API を使用してブレンディング ステートを作成および設定する方法については「ブレンド機能の構成」を参照してください。To see how to use the API to create and set blend state, see Configuring Blending Functionality.

固定機能ブレンディングは、レンダー ターゲットごとに個別に有効にすることができます。Fixed-function blend can be enabled independently for each render target. ただし、ブレンディング制御は 1 組しかないため、ブレンディングが有効なすべての RenderTargets に同じブレンディングが適用されます。However there is only one set of blend controls, so that the same blend is applied to all RenderTargets with blending enabled. ブレンディング値 (BlendFactor を含む) は常に、ブレンディング前にレンダー ターゲット フォーマットの範囲にクランプされます。Blend values (including BlendFactor) are always clamped to the range of the render-target format before blending. クランプは、レンダー ターゲット タイプを考慮して、レンダー ターゲットごとに実行されます。Clamping is done per render target, respecting the render target type. ただし、クランプされない float16、float11、および float10 フォーマットは例外で、これらのフォーマットのブレンディング処理は、少なくとも出力フォーマットと同じ精度/範囲で実行できます。The only exception is for the float16, float11 or float10 formats which are not clamped so that blend operations on these formats can be done with at least equal precision/range as the output format. NaN および符号付きのゼロは、すべての場合について伝搬されます (0.0 のブレンドの重みを含みます)。NaN's and signed zeros are propagated for all cases (including 0.0 blend weights).

sRGB レンダー ターゲットを使用する際、ランタイムはブレンディングを実行する前にレンダー ターゲットの色を線形空間に変換します。When you use sRGB render targets, the runtime converts the render target color into linear space before it performs blending. ランタイムは、レンダー ターゲットに値を保存する前に、最終的なブレンドされた値をsRGB 空間に変換します。The runtime converts the final blended value back into sRGB space before it saves the value back to the render target.

デュアル元の色のブレンドDual-source color blending

この機能を使用すると、出力マージャーステージで、スロット 0 の 1 つのレンダー ターゲットを使用するブレンディング処理の入力として両方のピクセル シェーダー出力 (o0 および o1) を同時に使用することができます。This feature enables the Output Merger stage to simultaneously use both pixel shader outputs (o0 and o1) as inputs to a blending operation with the single render target at slot 0. 有効なブレンディング処理には、加算、減算、および逆減算があります。Valid blend operations include: add, subtract and revsubtract. ブレンドの式および出力書き込みマスクによって、ピクセル シェーダーが出力する成分が指定されます。The blend equation and the output write mask specify which components the pixel shader is outputting. それ以外の成分は無視されます。Extra components are ignored.

他のピクセル シェーダー出力 (o2、o3 など) への書き込みは定義されていません。スロット 0 にバインドされていない場合、レンダー ターゲットに書き込むことはできません。Writing to other pixel shader outputs (o2, o3 etc.) is undefined; you may not write to a render target if it is not bound to slot 0. デュアル ソースのカラー ブレンディング時には、oDepth の書き込みは有効です。Writing oDepth is valid during dual source color blending.

深度ステンシル テストの概要Depth-stencil testing overview

テクスチャ リソースとして作成される深度/ステンシル バッファーは、深度データとステンシル データの両方を格納できます。A depth-stencil buffer, which is created as a texture resource, can contain both depth data and stencil data. 深度データは、カメラに最も近い位置に配置されたピクセルを特定するために使用され、ステンシル データは、更新可能なピクセルをマスクするために使用されます。The depth data is used to determine which pixels lie closest to the camera, and the stencil data is used to mask which pixels can be updated. 最終的には、深度値とステンシル値のデータの両方が、ピクセルを描画する必要があるかどうかを決定するために出力結合 (OM) ステージで使用されます。Ultimately, both the depth and stencil values data are used by the output-merger stage to determine if a pixel should be drawn or not. 次の図は、深度/ステンシル テストがどのように実行されるかを概念的に示したものです。The following diagram shows conceptually how depth-stencil testing is done.

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

深度/ステンシル テストを構成する方法については、「深度/ステンシル機能の構成」を参照してください。To configure depth-stencil testing, see Configuring Depth-Stencil Functionality. 深度/ステンシル オブジェクトは、深度/ステンシル ステートをカプセル化します。A depth-stencil object encapsulates depth-stencil state. アプリケーションでは深度/ステンシル ステートを指定することができ、指定しない場合は、OM ステージでデフォルト値が使用されます。An application can specify depth-stencil state, or the OM stage will use default values. マルチサンプリングが無効な場合は、ピクセル単位でブレンディング処理が実行されます。Blending operations are performed on a per-pixel basis if multisampling is disabled. マルチサンプリングが有効な場合は、マルチサンプル単位でブレンディングが実行されます。If multisampling is enabled, blending occurs on a per-multisample basis.

深度バッファーを使用して描画するピクセルを決定する処理は、深度バッファーリングと呼ばれます。また、z バッファーリングと呼ばれることもあります。The process of using the depth buffer to determine which pixel should be drawn is called depth buffering, also sometimes called z-buffering.

(補間とピクセル シェーダーのどちらから送信されたかに関係なく) 深度値が出力結合 (OM) ステージに到達すると、常に、浮動小数点ルールを使用して、深度バッファーのフォーマット/精度に従って z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) にクランプされます。Once depth values reach the output-merger stage (whether coming from interpolation or from a pixel shader) they are always clamped: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) according to the format/precision of the depth buffer, using floating-point rules. クランプ後、深度値は、DepthFunc を使用して既存の深度バッファー値と比較されます。After clamping, the depth value is compared (using DepthFunc) against the existing depth-buffer value. 深度バッファーがバインドされていない場合は、常に深度テストに合格します。If no depth buffer is bound, the depth test always passes.

深度バッファー フォーマットにステンシル成分がない場合、または深度バッファーがバインドされていない場合は、常にステンシル テストに合格します。If there is no stencil component in the depth-buffer format, or no depth buffer bound, then the stencil test always passes.

一度にアクティブにすることができる深度/ステンシル バッファーは 1 つだけです。バインドされたリソース ビューは、深度/ステンシル ビューと一致していなければなりません (サイズと次元が同じでなければなりません)。Only one depth/stencil buffer can be active at a time; any bound resource view must match (same size and dimensions) the depth/stencil view. これは、リソース サイズが一致していなければならないことを意味するものではなく、ビュー サイズが一致していればよいことを意味します。This does not mean the resource size must match, just that the view size must match.

サンプル マスクの概要Sample mask overview

サンプル マスクは、アクティブなレンダー ターゲットで更新されるサンプルを決定する 32 ビットのマルチサンプリング カバレッジ マスクです。A sample mask is a 32-bit multisample coverage mask that determines which samples get updated in active render targets. サンプル マスクは 1 つだけ使用できます。Only one sample mask is allowed. サンプル マスク内のビットからリソース内のサンプルへのマッピングは、ユーザーが定義します。The mapping of bits in a sample mask to the samples in a resource is defined by a user. n サンプル レンダリングの場合、サンプル マスクの (LSB から) 最初の n ビットが使用されます (最大ビット数は 32 ビットです)。For n-sample rendering, the first n bits (from the LSB) of the sample mask are used (32 bits it the maximum number of bits).

入力Input

出力マージャー (OM) ステージでは、次のものを組み合わせて使用することで、レンダリングされる最終的なピクセル カラーを生成します。The Output Merger (OM) stage generates the final rendered pixel color using a combination of the following:

  • パイプライン ステートPipeline state
  • ピクセル シェーダーによって生成されたピクセル データThe pixel data generated by the pixel shaders
  • レンダー ターゲットの内容The contents of the render targets
  • 深度/ステンシル バッファーの内容The contents of the depth/stencil buffers.

出力Output

出力書き込みマスクの概要Output-write mask overview

出力書き込みマスクは、レンダー ターゲットに書き込むことができるデータを (成分ごとに) 制御するために使用します。Use an output-write mask to control (per component) what data can be written to a render target.

複数のレンダー ターゲットの概要Multiple render targets overview

1 つのピクセル シェーダーを使用して、少なくとも 8 つの別個のレンダー ターゲットにレンダリングすることができます。これらはすべて、同じタイプでなければなりません (バッファー、Texture1D、Texture1DArray など)。A pixel shader can be used to render to at least 8 separate render targets, all of which must be the same type (buffer, Texture1D, Texture1DArray, and so on). さらに、レンダー ターゲットはすべて、すべての次元 (幅、高さ、奥行き、配列のサイズ、サンプル カウント) でサイズが同じでなければなりません。Furthermore, all render targets must have the same size in all dimensions (width, height, depth, array size, sample counts). 各レンダー ターゲットでデータ フォーマットが異なっていてもかまいません。Each render target may have a different data format.

レンダー ターゲット スロット (最大 8 つ) を任意の組み合わせで使用することができます。You may use any combination of render targets slots (up to 8). ただし、リソース ビューを複数のレンダー ターゲット スロットに同時にバインドすることはできません。However, a resource view cannot be bound to multiple render-target-slots simultaneously. 複数のリソースが同時に使用されていない限り、ビューは再利用することができます。A view may be reused as long as the resources are not used simultaneously.

このセクションの内容In this section

トピックTopic 説明Description

深度ステンシルの機能を構成します。Configuring depth-stencil functionality

ここでは、出力結合 (OM) ステージの深度/ステンシル バッファーと深度/ステンシル ステートを設定する手順について説明します。This section covers the steps for setting up the depth-stencil buffer, and depth-stencil state for the output-merger stage.

 

関連トピックRelated topics

グラフィックス パイプラインGraphics pipeline