1

だから私は、3D キューブベースの世界があるプロジェクトに取り組んでいます。すべてが機能するようになり、ユーザー インターフェイスを開始しています。spritebatch を使用してカーソル テクスチャを描画し始めた瞬間、XNA がすべてのモデルを正しくレイヤー化していないことがわかりました。モデルの後ろではなく、遠くにあるモデルが最初に描画されます。spritebatch コードをすべて取り出すと、次のようになります。

        spriteBatch.Begin();
        cursor.draw(spriteBatch);
        spriteBatch.End();

問題がすぐに修正されることがわかりました。カーソルはオブジェクトで、draw メソッドはspriteBatch.draw();を使用しています。

私の見方では、2 つの解決策があります。SpriteBatchspriteBatch.Begin()を使用せずにカーソルやその他のインターフェイスを描画する方法を見つけることができます。または、問題を解決するためにプラグインできるパラメーターが存在する可能性があります。これらのいずれかを行う方法がわかりません。他の誰かがこの問題に遭遇し、それを修正する方法を知っていますか?

前もって感謝します。

4

2 に答える 2

4

これは質問に答えません!

スプライトバッチなしで 2D を描画できる (または描画する必要がある) かどうかはわかりませんが、2D スプライトバッチを使用すると 3D モデルのレンダリングで同じ問題が発生し、GameDev で見つけた解決策の解決策がこれを解決するのに役立ちました:

デバイスの状態が間違っている可能性があります。これは、2D と 3D が混在している場合によく発生します (たとえば、引数を取らない SpriteBatch.Begin() のオーバーロードは、3D レンダリングと互換性のないデバイスの状態を設定します。デバイスの状態は、必要に応じて設定されます。

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

基本的に、まずSpriteBatch2D 描画用のメソッドを呼び出し、次に上記のコード (適切な 3D レンダリングを保証する必要があります) を呼び出してから、3D モデルを描画します。実際、私は最初の 2 行だけを使用しBlendStateましたDepthStencilStateが、それは正常に機能しました。

于 2012-10-23T21:09:02.943 に答える
2

このオーバーロードを見たことがありますか?

最後のパラメータ、layerDepth を使用して、スプライトが描画される順序を制御できます。それを使用する場合は、スプライトの並べ替えモード(SpriteBatch.Begin(...) 呼び出し内) も確認してください。これはあなたがする必要があることをカバーしていますか?

編集:また、これは正しい遠近行列を使用し、2Dで描画することを意味することに注意してください(カーソルを他のすべての上に2Dで表示することを想定しています)、すべての3Dの後に(スプライトを描画することはかなり可能ですたとえば、Z=0 の前にあるオブジェクトをスプライトの邪魔にします)。

于 2012-10-23T17:12:50.710 に答える