DirectXでの乗算描画が正常にできないケースがある
Posted: 2016年12月24日(土) 15:44
現在、DirectXを使って画像描画を行っており、以下のコードで乗算描画を行っています。
ただし、これではうまくいかないことがあり、その切り分けを行ったところ、
乗算描画を行う前にテクスチャ無しのDrawPrimitiveUPを行った場合、という条件でした。
(つまり、SetTexture( 0, NULL );として描画を行った直後に乗算描画を行った場合のみ。
画像テクスチャを使った描画の後では問題ありませんでした。)
バックバッファはX8R8G8B8ですし、ステンシルもZバッファも使用していません。
テクスチャの有無に関わらず、バックバッファにはXRGBの色情報が格納されるのみと思っており、
何故違いが起きるのかがわかりません。
何かわかることがありましたら、ぜひお願いいたします。
デバイス作成の引数は以下の通りです。
m_D3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_D3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
m_D3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
m_D3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR);
D3DCOLOR Factor = D3DCOLOR_XRGB(255, 255, 255);
m_D3DDevice->SetRenderState(D3DRS_TEXTUREFACTOR, Factor);
m_D3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP , D3DTOP_SELECTARG2);
m_D3DDevice->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
m_D3DDevice->SetTextureStageState(1, D3DTSS_COLOROP , D3DTOP_BLENDCURRENTALPHA);
m_D3DDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
m_D3DDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TFACTOR);
乗算描画を行う前にテクスチャ無しのDrawPrimitiveUPを行った場合、という条件でした。
(つまり、SetTexture( 0, NULL );として描画を行った直後に乗算描画を行った場合のみ。
画像テクスチャを使った描画の後では問題ありませんでした。)
バックバッファはX8R8G8B8ですし、ステンシルもZバッファも使用していません。
テクスチャの有無に関わらず、バックバッファにはXRGBの色情報が格納されるのみと思っており、
何故違いが起きるのかがわかりません。
何かわかることがありましたら、ぜひお願いいたします。
デバイス作成の引数は以下の通りです。
m_D3DParameters.BackBufferWidth = 800;
m_D3DParameters.BackBufferHeight = 600;
m_D3DParameters.BackBufferFormat = d3ddm.Format; /*D3DFMT_X8R8G8B8です*/
m_D3DParameters.Windowed = TRUE;
m_D3DParameters.BackBufferCount = 1;
m_D3DParameters.MultiSampleType = D3DMULTISAMPLE_NONE;
m_D3DParameters.MultiSampleQuality = 0;
m_D3DParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_D3DParameters.EnableAutoDepthStencil = FALSE;
m_D3DParameters.AutoDepthStencilFormat = D3DFMT_D16;
m_D3DParameters.hDeviceWindow = m_hWnd; /*メインウィンドウのハンドルです*/
m_D3DParameters.Flags = 0;
m_D3DParameters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_D3DParameters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;