はかせのラボ

私の頭の中を書いていく雑記ブログです

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);

これで画像が半透明になっていい感じで見えるようになるはずです。
f:id:hakase0274:20190122211520p:plain

やった!半透明になりました!
(なんかちょっと暗いけど)
これでエフェクト作りができるぞ。

でもなにやらおかしいぞ・・・

次の画像を見てください。
f:id:hakase0274:20190122211704p:plain

黒い文字でかかれているPが透過されているのもありますが、
レーザーに黒いラインのようなものがでています。

調べたところこれは補間アルファブレンディングをした場合発生する
現象のようです。
この問題を解決するためには乗算済みアルファブレンディング
行う必要があるようです。

ただ調べてみてもどうやらそれ用の設定はないっぽいです・・・

あとがき

今回はαブレンドの話でした。
半透明にすることはできましたが、
黒くにじんでしまいました。

解決方法自体は見つかりましたが
肝心の実装方法がわかりません。
(DirectXってどうしてこんなに入用になりやすい機能がないんだろうね)

それでは今回はこの辺でノシ