フレーム バッファー アルファ (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 | (広告、広告、広告、広告) |
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_INVSRCALPHAとD3DBLEND_SRCALPHAに設定することで、同じ効果を実現できます。 |
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);
このコードでは、ソースの色 (現在の場所でレンダリングされるプリミティブの色) と変換先の色 (フレーム バッファー内の現在の場所の色) の間で線形ブレンドを実行します。 結果として得られる外観は、変換先オブジェクトの色の一部がソース オブジェクトを介して送信されるように見えるという点で、濃色ガラスに似ています。残りの部分は吸収されているようです。
これらのブレンド 係数の多くは、テクスチャのアルファ値が正しく動作する必要があります。 したがって、頂点またはマテリアルアルファを使用する場合、どのモードが興味深い結果を生成するかについてアプリケーションが制限されます。
関連トピック