フレーム バッファー アルファ (Direct3D 9)
フレーム バッファーのアルファブレンディングは、頂点アルファ、マテリアル アルファ、およびテクスチャー アルファとは少々異なります。頂点、マテリアル、およびテクスチャー アルファは、現在のプリミティブのみに使用される透明度値を設定し、それ自身は他のプリミティブには何の影響もありません。フレーム バッファーのアルファ ブレンディングは、現在のプリミティブをフレーム バッファー内の既存のピクセルと組み合わせて最終的なピクセル カラーを生成する方法を制御します。
アルファ ブレンディングを実行すると、元のカラーと対象カラーという 2 つのカラーが結合されます。元のカラーは透明なオブジェクトからのカラーで、対象カラーはすでにピクセル位置に存在するカラーです。対象カラーは、透明なオブジェクトの背後にあるその他のオブジェクト、つまり透明なオブジェクトを通して見えるオブジェクトをレンダリングした結果です。アルファ ブレンディングは、公式を使用して元のオブジェクトと対象オブジェクトとの間の比率を制御します。
Final Color = ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor
ObjectColor は、現在のピクセル位置でレンダリングされるプリミティブからのコントリビューションです。PixelColor は、現在のピクセル位置のフレーム バッファーからのコントリビューションです。
使用できるアルファ ブレンド係数のセットを以下に示します。
ブレンディング モードの係数 | 説明 |
---|---|
D3DBLEND_ZERO | (0, 0, 0, 0) |
D3DBLEND_ONE | (1, 1, 1, 1) |
D3DBLEND_SRCCOLOR | (Rs, Gs, Bs, As) |
D3DBLEND_INVSRCCOLOR | (1-Rs, 1-Gs, 1-Bs, 1-As) |
D3DBLEND_SRCALPHA | (As, As, As, As) |
D3DBLEND_INVSRCALPHA | (1-As, 1-As, 1-As, 1-As) |
D3DBLEND_DESTALPHA | (Ad, Ad, Ad, Ad) |
D3DBLEND_INVDESTALPHA | (1-Ad, 1-Ad, 1-Ad, 1-Ad) |
D3DBLEND_DESTCOLOR | (Rd, Gd, Bd, Ad) |
D3DBLEND_INVDESTCOLOR | (1-Rd, 1-Gd, 1-Bd, 1-Ad) |
D3DBLEND_SRCALPHASAT | (f, f, f, 1); f = min(As, 1-Ad) |
D3DBLEND_BOTHSRCALPHA | DirectX 6 以降は廃止されます。ソース ブレンド係数とデスティネーション ブレンド係数を別々に呼び出して、D3DBLEND_SRCALPHA と D3DBLEND_INVSRCALPHA に設定することで同じエフェクトを取得できます。 |
D3DBLEND_BOTHINVSRCALPHA | DirectX 6 では廃止されます。ソース ブレンド係数とデスティネーション ブレンド係数を別々の呼び出しで D3DBLEND_SRCALPHA と D3DBLEND_INVSRCALPHA に設定することで同じエフェクトを取得できます。 |
D3DBLEND_BLENDFACTOR | D3DRS_BLENDFACTOR 設定から取得した color.r、color.g、color.b、color.a を使用してください。 |
D3DBLEND_INVBLENDFACTOR | D3DRS_BLENDFACTOR 設定から取得した 1-color.r、1-color.g、1-color.b、および 1-color.a を使用してください。 |
Direct3D では D3DRS_ALPHABLENDENABLE レンダリング ステートを使用してアルファ透明ブレンディングを有効にします。実行されるアルファ ブレンディングのタイプは、D3DRS_SRCBLEND と D3DRS_DESTBLEND のレンダリング ステートによって決まります。ソース ブレンディング ステートとデスティネーション ブレンディング ステートは、ペアで使用します。次のコード フラグメントでは、ソース ブレンディング ステートを D3DBLEND_SRCCOLOR に設定し、デスティネーション ブレンディング ステートを D3DBLEND_INVSRCCOLOR に設定しています。
// This code fragment assumes that lpD3DDevice is a
// valid pointer to a device.
// Enable alpha blending.
lpD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,
TRUE);
// Set the source blend state.
lpD3DDevice->SetRenderState(D3DRS_SRCBLEND,
D3DBLEND_SRCCOLOR);
// Set the destination blend state.
lpD3DDevice->SetRenderState(D3DRS_DESTBLEND,
D3DBLEND_INVSRCCOLOR);
このコードは、元のカラー (現在の位置でレンダリングされるプリミティブのカラー) と対象カラー (フレーム バッファーの現在位置のカラー) との間の線形ブレンドを実行します。この結果は、対象オブジェクトのカラーの一部が元のオブジェクトを介して伝えられ、残りのカラーが吸収されたように見え、ティンテッド ガラスに似ています。
これらのブレンド係数の多くは、正しく動作するためにテクスチャー内のアルファ値を必要とします。そのため、頂点またはマテリアル アルファを使用する場合、この適用は面白い結果を生成するモードに制限されます。