テクスチャに半透明ポリゴンを描画すると透ける??
DirectX9で不透明なテクスチャに半透明ポリゴンを描画すると、ポリゴンを描画した部分が透けてしまうのはなぜですか?
1.「D3DUSAGE_RENDERTARGET」指定したテクスチャを作成して白でクリア
2.そのテクスチャに半透明の青いポリゴンをDrawPrimitiveUPで描画
3.そのテクスチャをD3DXSaveTextureToFileでPNG等で保存
とした場合、私のイメージでは白地に薄い青の四角が描かれた不透明な画像ファイルができると思ったんですが、青の部分が半透明になりました。
なぜ不透明なテクスチャに半透明ポリゴンを描くと半透明になるのでしょうか・・・?
――――――――――――――――――――――――――――――――――――
//レンダリング用テクスチャの準備
{
global.pDevice->CreateTexture( 512, 512, 1, D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTarget, NULL);
pTarget->GetSurfaceLevel(0, &pSurface);
global.pDevice->GetRenderTarget(0, &pBackBuffer); //バックバッファの取得
global.pDevice->SetRenderTarget(0, pSurface); //ターゲットの切り替え
//白(不透明)にクリア
global.pDevice->Clear( 0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_ARGB(255, 255, 255, 255), 1.0f, 0 );
}
//テクスチャに半透明ポリゴンを描画
{
VERTEX point[4] ={
D3DXVECTOR3(100, 200, 1), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255),
D3DXVECTOR3(100, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255),
D3DXVECTOR3(200, 200, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255),
D3DXVECTOR3(200, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255)
};
global.pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
global.pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, point, sizeof(VERTEX));
global.pDevice->SetRenderTarget(0, pBackBuffer); //レンダリングターゲット戻す
}
//テクスチャを保存
{
D3DXSaveTextureToFile("d:\\hoge.png", D3DXIFF_PNG, pTarget, NULL);
}
――――――――――――――――――――――――――――――――
D3DTSS_ALPHAOPをADDにしてみたりしたのですが、変化がありません。
テクスチャが透ける理屈と、こうならないようにする手段(アルファ値は加算したい)を教えてもらえると助かります。
お礼
回答ありがとうございます。わかりました。 あのまた質問なのですが、また描画されなくなりました。今度は別の方法で描画しようとしたのですが。できません。ソースはこれです。 問題と思われるところを載せます。 / レンダリング・テクスチャのフォーマット選択 static HRESULT SelectRenderTexterFormat(UINT adapter,D3DDEVTYPE device,D3DDISPLAYMODE dmode) { const D3DFORMAT c_fmtRenderTexter[]={ D3DFMT_X8R8G8B8, D3DFMT_X1R5G5B5, D3DFMT_R5G6B5 }; HRESULT hr=E_FAIL; g_fmtRenderTexterWnd=D3DFMT_UNKNOWN; for(int i=0;i<sizeof(c_fmtRenderTexter)/sizeof(c_fmtRenderTexter[0]);i++) { hr=g_pD3D->CheckDeviceFormat(adapter,device, dmode.Format,D3DUSAGE_RENDERTARGET,D3DRTYPE_TEXTURE,c_fmtRenderTexter[i]); if(SUCCEEDED(hr)) { if(FMT_DEPTHSTENCIL != D3DFMT_UNKNOWN) { hr=g_pD3D->CheckDepthStencilMatch(adapter,device, dmode.Format,c_fmtRenderTexter[i],FMT_DEPTHSTENCIL); if(FAILED(hr)) continue; } g_fmtRenderTexterWnd=c_fmtRenderTexter[i]; break; } } if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectRenderTexterFormat Window"),hr); g_fmtRenderTexterFull=D3DFMT_UNKNOWN; for(int i=0;i<sizeof(c_fmtRenderTexter)/sizeof(c_fmtRenderTexter[0]);i++) { hr=g_pD3D->CheckDeviceFormat(adapter,device, g_D3DPPFull.BackBufferFormat,D3DUSAGE_RENDERTARGET,D3DRTYPE_TEXTURE,c_fmtRenderTexter[i]); if(SUCCEEDED(hr)) { if(FMT_DEPTHSTENCIL != D3DFMT_UNKNOWN) { hr=g_pD3D->CheckDepthStencilMatch(adapter,device, g_D3DPPFull.BackBufferFormat,c_fmtRenderTexter[i],FMT_DEPTHSTENCIL); if(FAILED(hr)) continue; } g_fmtRenderTexterFull=c_fmtRenderTexter[i]; break; } } if(FAILED(hr)) return DXTRACE_ERR_MSGBOX(_T("SelectRenderTexterFormat Full"),hr); return S_OK; } ご教授よろしくお願いします。