0

サードパーティの関数からピクセル(ARGB)をコピーするサーフェス(OffScreenPlainまたはD3DFMT_A8R8G8B8のRenderTarget)があります。ピクセルコピーの前に、ビットはLockRectによってアクセスされます。

このサーフェスは、(D3DFMT_A8R8G8B8)であるバックバッファーへのStretchRectになります。サーフェスとバックバッファは異なる寸法です。フィルタリングはD3DTEXF_NONEに設定されます。

d3dデバイスを作成した直後に、次のRenderState設定を設定しました

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

しかし、アルファブレンディングは発生していません。アルファがピクセルで指定されていることを確認しました。

頂点バッファーを作成し、アルファブレンディングで表示される三角形(DrawPrimitive)を描画することにより、簡単なテストを行いました。

このテストサーフェスでは、最初にStretchRect、次にDrawPrimitiveがあり、サーフェスコンテンツはアルファブレンディングなしで表示され、三角形はアルファブレンディングありで表示されます。

ここで何が欠けていますか?ありがとう

4

1 に答える 1

2

あなたが言及した状態は頂点にのみ影響します。テクスチャを正しくブレンドするには、テクスチャアルファを頂点1とブレンドする方法を指定する必要があります。あなたはこのようにこれをします:

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

デフォルトALPHAOPはですSELECTARG1。つまり、レンダリングではテクスチャアルファのみが考慮されます。

別の解決策はID3DXSprite::Draw、テクスチャをバックバッファにコピーする方法を使用することです。D3DCOLOR_ARGB(X, 255, 255, 255)Xがアルファである色を渡すだけです。この方法では、すべての状態の調整が行われ、最終結果は期待に一致します。

于 2012-04-06T08:44:06.900 に答える