0

テキストとスプライトを描画する C++ コードで使用されるフックされた DirectX があります。テストしたところ、2D アプリケーションにうまく描画されました。しかし、3D アプリケーション (実際には複雑なゲーム) で試してみると、テキストしか表示されませんでした。そのことから、スプライトが他の何かによって上書きされていないと推測したため、テキストも上書きされます。旗を立てました

    SetVertexShader(0);
    SetPixelShader(0);
    SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);

    //SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 
    SetRenderState(D3DRS_ZENABLE, false);
    SetRenderState(D3DRS_LIGHTING, FALSE);
    SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
    SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);

何らかの理由でALPHABLEND、スプライトがどのアプリケーションでもまったく表示されなくなったため、有効にせず、コメントアウトしました。

D3D 上にスプライトを描画する確実な方法はありますか? それ以外の場合、それらに異なるフラグ/値を使用する必要がありますか?

また、スプライトが実際に他のスプライト/オブジェクトの「下」にある場合に備えて、スプライトにどの z-index を設定する必要がありますか?

(私はデバイスに描画されるものの作成者ではありません。フックされた DirectX API しか持っておらず、描画するアプリケーションのコードさえ知りません)。

4

1 に答える 1

0

まず、スプライトを D3D デバイスにレンダリングする最も簡単な方法は ID3DXSprite です。

第二に、タイプミスがあり、COLOROP を ALPHAOP ではなく MODULATE に設定するつもりだったと思います。

ただし、どちらの場合も、アルファが 0 の場合にのみ、目に見えない出力になると思います。使用しているテクスチャが完全に透明である可能性はありますか?

また、挿入されたレンダリング コードの処理が完了したら、(直接的または間接的に) 変更したすべてのレンダリング ステートを復元することを忘れないでください。これを行う簡単な方法は、状態ブロックをキャプチャし、独自のレンダリングが完了した後に適用することです。

于 2010-08-27T14:12:59.280 に答える