DirectX αブレンドができない
あいさつ
どうも、はかせです。
今回は前回から始めた透過処理です。
実装
計算式があるようですがDirectX11では
ID3D11BlendStateを使うことで設定のみで
この処理を行うことが出来るそうです。
ということで設定してみます。
ID3D11BlendState* mBlendState; D3D11_BLEND_DESC BlendDesc; ZeroMemory(&BlendDesc, sizeof(BlendDesc)); BlendDesc.AlphaToCoverageEnable = FALSE; BlendDesc.IndependentBlendEnable = FALSE; BlendDesc.RenderTarget[0].BlendEnable = TRUE; BlendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; BlendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE; BlendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; BlendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; BlendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA; BlendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; BlendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; mDevice->CreateBlendState(&BlendDesc, &mBlendState); //描画処理のタイミングで以下の処理を行う float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; mDeviceContext->OMSetBlendState(mBlendState, blendFactor, 0xffffffff);
これで画像が半透明になっていい感じで見えるようになるはずです。
やった!半透明になりました!
(なんかちょっと暗いけど)
これでエフェクト作りができるぞ。
でもなにやらおかしいぞ・・・
次の画像を見てください。
黒い文字でかかれているPが透過されているのもありますが、
レーザーに黒いラインのようなものがでています。
調べたところこれは補間アルファブレンディングをした場合発生する
現象のようです。
この問題を解決するためには乗算済みアルファブレンディングを
行う必要があるようです。
ただ調べてみてもどうやらそれ用の設定はないっぽいです・・・