2

DirectX 10でカスタムHUDシステムを作成しようとしています。現在の攻撃方法は、メッシュのツリーを使用してメニューのさまざまなレベルを表すことです。

デプステストを無効にすることで、バックグラウンドで他の3Dワールドの上に貼り付けられるメッシュを作成できると思います。これを実現するために、D3D10_DEPTH_STENCIL_DESCを使用して、DepthEnableオプションをfalseに設定しようとしました。次に、このD3D10_DEPTH_STENCIL_DESCをステンシル状態にバインドし、メッシュを描画する直前にアクティブにします。これまでのところ、メッシュが欠落しています。

私の質問は、要約すると次のようになります。私はこれで正しい方向に進んでいますか、それともこれを完全に再考する必要がありますか?さらに、これがこの問題に対する攻撃の良い計画である場合、私が考慮に入れるのを忘れていることはありますか?

以下は、このHUDを取得しようとするコードの一部です。

D3D10_DEPTH_STENCIL_DESCの作成:

    //HUD Elements
D3D10_DEPTH_STENCIL_DESC dsDesc;
//Depth Settings 
dsDesc.DepthEnable      = false;
dsDesc.DepthWriteMask   = D3D10_DEPTH_WRITE_MASK_ALL;
dsDesc.DepthFunc        = D3D10_COMPARISON_LESS;
//Stencil settings
dsDesc.StencilEnable    = true;
dsDesc.StencilReadMask  = 0xff;
dsDesc.StencilWriteMask = 0xff;
//Always pass the stencil test, and replace the current stencil value with 
// the stencil reference value 1
dsDesc.FrontFace.StencilFailOp      = D3D10_STENCIL_OP_KEEP;
dsDesc.FrontFace.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP;
dsDesc.FrontFace.StencilPassOp      = D3D10_STENCIL_OP_REPLACE;
dsDesc.FrontFace.StencilFunc        = D3D10_COMPARISON_ALWAYS;
// We are not rendering backfacing polygons, so these settings do not matter.
dsDesc.BackFace.StencilFailOp       = D3D10_STENCIL_OP_KEEP;
dsDesc.BackFace.StencilDepthFailOp  = D3D10_STENCIL_OP_KEEP;
dsDesc.BackFace.StencilPassOp       = D3D10_STENCIL_OP_REPLACE;
dsDesc.BackFace.StencilFunc         = D3D10_COMPARISON_ALWAYS;
//Bind HUD to a stencil
HR(md3dDevice->CreateDepthStencilState(&dsDesc,&hud));

描くために私は単にします:

    md3dDevice->OMSetDepthStencilState(hud, 1);
menu.draw(mVP);
4

1 に答える 1

1

ええ、あなたは正しい木を吠えています。ただし、メニューシステムが階層化されている場合は、Zバッファが役に立たないため、前に戻す必要があることに注意してください。これはかなりのオーバードローを意味します。

別のソリューションでは、Zバッファを使用して(特に初期のZを使用するとハードウェアサポートが拒否されます)、前面から背面に描画することで、オーバードローの量を制限できます。ただし、シーンと相互作用するという問題があります。これは、メニューをレンダリングする前にZバッファをクリアするだけで簡単に修正できます。

TBHは、描画呼び出しをはるかに効率的にまとめてバッチ処理できることを意味するため、Zバッファクリアリングメソッドを使用するのが最善です。つまり、ID3D10Bufferを常にマッピングして埋めるのは、一度行ってから継続的に再描画するよりも遅くなります。確かに、状態が変化したときにバッファを編集する必要があるかもしれませんが、編集するバッファの量を制限できます。また、状態が変化しないときは、CPUを不必要にかみ砕くことはありません。

于 2010-11-11T10:08:14.060 に答える