2012-04-05 10 views
0

私はサードパーティの関数から、画素(ARGB)にコピー表面(D3DFMT_A8R8G8B8とOffScreenPlainまたはレンダーターゲット)を有します。ピクセルコピーの前に、ビットはLockRectによってアクセスされます。D3D9アルファブレンディングは

この表面は、その後、(D3DFMT_A8R8G8B8)であるバックバッファにStretchRectあります。 SurfaceとBackbufferは異なる次元です。フィルタリングはD3DTEXF_NONEに設定されます。

だけD3Dデバイスを作成した後、私は

D3DRS_ALPHABLENDENABLE -> TRUE 
D3DRS_BLENDOP   -> D3DBLENDOP_ADD 
D3DRS_SRCBLEND   -> D3DBLEND_SRCALPHA 
D3DRS_DESTBLEND  -> D3DBLEND_INVSRCALPHA 

次RenderStateの設定を設定しました。しかし私は、アルファブレンディングが起こっていない参照してください。私はアルファがピクセルで指定されていることを確認しました。

Iは、頂点バッファを作成し、アルファブレンドで表示三角形(DrawPrimitive)を描画することにより、簡単なテストを行ってきました。この試験面において

はStretchRectアルファブレンディングとアルファブレンディングを有する三角形が表示させずに第一及びその後DrawPrimitive、および表面コンテンツが表示されました。

私はここで何が欠けていますか?あなたが言及したおかげ

答えて

2

国は頂点のみに影響します。テクスチャを正しくブレンドするには、テクスチャのアルファと頂点のブレンド方法を指定する必要があります。あなたはこのようにこれを行う:デフォルトALPHAOPことで

d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); 

はすなわちのみテクスチャアルファをレンダリングする際に考慮され、SELECTARG1です。

別の解決策は、バックバッファにテクスチャをコピーするID3DXSprite::Draw方法を使用しています。色はD3DCOLOR_ARGB(X, 255, 255, 255)となります。ここで、Xはあなたのアルファです。このメソッドはすべての状態の調整を行い、最終的な結果は期待通りになります。