Share via


ブレンディング機能の構成 (Direct3D 10)

ブレンディング処理は、出力値がレンダー ターゲットに書き込まれる前に、各ピクセル シェーダー出力 (RGBA 値) に対して実行されます。マルチサンプリングを有効にすると、マルチサンプリングごとにブレンディングが実行されます。有効にしない場合は、ピクセルごとにブレンディングが実行されます。

  • ブレンディング ステートの作成
  • ブレンディング ステートのバインド
  • ブレンディングの高度なトピック

ブレンディング ステートの作成

ブレンディング ステートは、ブレンディングを制御するために使用されるステートの集合です。これらのステート (D3D10_BLEND_DESC で定義) は、ID3D10Device::CreateBlendState を呼び出すことによって、ブレンディング ステート オブジェクトを作成するために使用されます。

たとえば、非常に単純なブレンディング ステートの作成例を次に示します。この例では、アルファ ブレンディングを無効にし、成分単位のピクセル マスキングは使用していません。

 ID3D10BlendState* g_pBlendStateNoBlend = NULL;  D3D10_BLEND_DESC BlendState; ZeroMemory(&BlendState, sizeof(D3D10_BLEND_DESC)); BlendState.BlendEnable[0] = FALSE; BlendState.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL; pd3dDevice->CreateBlendState(&BlendState, &g_pBlendStateNoBlend); 

この例は、「HLSLWithoutFX10 サンプル」からの抜粋です。

ブレンディング ステートのバインド

ブレンディング ステート オブジェクトを作成したら、ID3D10Device::OMSetBlendState を呼び出して、ブレンディング ステート オブジェクトを出力結合ステージにバインドします。

 float blendFactor = 0; UINT sampleMask   = 0xffffffff;  pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask); 

この API は、3 つのパラメーターを取得します。それらは、ブレンディング ステート オブジェクト、4 成分ブレンディング係数、およびサンプル マスクです。ブレンディング ステート オブジェクトの代わりに NULL を渡してデフォルトのブレンディング ステートを指定することも、ブレンディング ステート オブジェクトを渡すこともできます。ブレンディング係数によって、新しいピクセル単位の値と既存の値とのブレンディングを成分単位で制御できます。サンプル マスクは、更新前に既存のレンダー ターゲットをサンプリングする方法を決定するユーザー定義マスクです。デフォルト サンプル マスクは 0xffffffff で、点のサンプリングを指定します。

ほとんどの深度バッファーリング スキームでは、カメラに最も近いピクセルが描画されます。深度/ステンシル ステートの設定時には、D3D10_DEPTH_STENCIL_DESC の DepthFunc パラメーターに任意の D3D10_COMPARISON_FUNC を渡すことができます。通常は、カメラに最も近いピクセルがその背後にあるピクセルを上書きするように、DepthFunc を D3D10_COMPARISON_LESS に設定します。ただし、アプリケーションのニーズに応じて、他の比較関数も深度テストの実行に使用することができます。

ブレンディングの高度なトピック

  • アルファトゥカバレッジ
  • ピクセル シェーダー出力のブレンディング

アルファトゥカバレッジ

アルファトゥカバレッジはマルチサンプリングの技法の一種で、複数のポリゴンが重なり合う密集した草木などの状況に最も役立ちます。アルファトゥカバレッジをオンにするには、ブレンディングの記述で AlphaToCoverageEnable 変数を True に設定します。アルファトゥカバレッジは、ラスタライザー ステートで (MultisampleEnable を True または False に設定することによって) マルチサンプリングがオンになっているかどうかに関係なく機能します。

アルファトゥカバレッジは、ピクセル シェーダーから出力された RGBA 値のアルファ成分を取得して、n ステップのカバレッジ マスクに変換することで機能します (n はサンプル カウントです)。この n ステップのカバレッジ マスクはマルチサンプリング カバレッジ マスクと論理積が実行され、その結果を使用して、出力結合に現在バインドされているすべてのレンダー ターゲットについて、更新する必要があるサンプルが決定されます。ピクセル シェーダーの出力にある元のアルファ値は、そのアルファ値が n ステップ カバレッジ マスクの作成に使用されたときも変更されません (アルファ ブレンディングは、引き続きサンプル単位で実行されます)。基本的に、アルファトゥカバレッジ マルチサンプリングは通常のマルチサンプリングと同じですが、n ステップ カバレッジ マスクが生成され、マルチサンプリング カバレッジ マスクと論理積が実行される点が異なります。

アルファトゥカバレッジの例については、「Instancing10 サンプル」を参照してください。

ピクセル シェーダー出力のブレンディング

この機能を使用すると、出力結合で、スロット 0 の 1 つのレンダー ターゲットを使用するブレンディング処理への入力の転送元として、両方のピクセル シェーダー出力を同時に使用することができます。

次の例では、2 つの結果を取得し、それらを 1 つのパスに結合して、乗算および加算によって転送先にブレンディングします。

 SrcBlend = D3D10_BLEND_ONE; DestBlend = D3D10_BLEND_SRC1COLOR; 

次の例では、最初のピクセル シェーダー出力を転送元のカラーとして構成し、2 番目の出力をカラー成分ごとのブレンディング係数として構成します。

 SrcBlend = D3D10_BLEND_SRC1COLOR; DestBlend = D3D10_BLEND_INVSRC1COLOR; 

次の例は、ブレンディング係数をシェーダーのスィズルと一致させる方法を示しています。

 SrcFactor = D3D10_BLEND_SRC1ALPHA; DestFactor = D3D10_BLEND_SRCCOLOR; OutputWriteMask[0] = .ra; // pseudocode for setting the mask at                           // RenderTarget slot 0 to .ra 

これらのブレンディング係数とシェーダー コードは、少なくとも o0.r および o1.a を出力するためにピクセル シェーダーが必要であることを意味しています。余分な出力成分がシェーダーによって出力されることがありますが、無視されて、予測できない結果を生成する成分は少なくなります。

関連項目

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