読者です 読者をやめる 読者になる 読者になる

catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

DirectX11 でアルファブレンディング

 DirectX11でのアルファブレンディングをやってみた。


いろいろ悩んだけども、まずは動かしてみる前提で。
将来的にはZバッファ無効化せずに実装したいところ。

まずZバッファを無効化する。
VisualStudioがデフォルトで吐き出したコードでは、しっかりとZバッファが設定されているはず。
ここを無効化しておかないと、カメラからみて奥のほうにある半透明オブジェクトが描画されないことがある。

    m_d3dContext->OMSetRenderTargets(
        1,                                    // ターゲット
        m_renderTargetView.GetAddressOf(),    // ビュー
        NULL()            // 深度バッファなし
        );

次にブレンド情報の設定。
Draw関数でポリゴン描画する前に呼び出しておく必要がある。
追加したコードは次のとおり。


ID3D11BlendState* pBlendState = NULL;
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_DEST_COLOR;
BlendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
BlendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
BlendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
BlendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
BlendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

float blendFactor[4] = {0.0f, 0.0f, 0.0f, 0.0f};
m_d3dDevice->CreateBlendState( &BlendDesc, &pBlendState );
m_d3dContext->OMSetBlendState( pBlendState, blendFactor, 0xffffffff );


まずはこれで加算半透明になる。
今後いろいろ改造していこう。