2

私は XNA の 3D にかなり慣れていませんが、残念ながら解決策が見つからない問題に遭遇しました。(問題が何であるかさえ知りません)。

簡単に言うと、次を使用してゲームでクワッドを描画しています。

        effect.World = Matrix.Identity *
            Matrix.CreateRotationX(Rotation.X) *
            Matrix.CreateRotationY(Rotation.Y) *
            Matrix.CreateRotationZ(Rotation.Z) *
            Matrix.CreateTranslation(Position);

        // Apply camera-matrixes
        effect.View = viewMatrix;
        effect.Projection = projectionMatrix;

        graphics.VertexDeclaration = vertDec;

        // Begin effect drawing
        effect.Begin();
        foreach (EffectPass pass in
            effect.CurrentTechnique.Passes)
        {
            pass.Begin();
            graphics.DrawUserIndexedPrimitives
                <VertexPositionNormalTexture>(
                PrimitiveType.TriangleList,
                quad.Vertices, 0, 4,
                quad.Indexes, 0, 2);
            pass.End();
        }

        effect.End();

私の効果には、次のプロパティもあります。

        this.effect.TextureEnabled = true;
        this.effect.Texture = texture;

そして、それは機能します。私のクワッドはきれいに描かれていて、私は幸せです. ただし、わずかな問題が 1 つあります。あるクワッドが別のクワッドまたは通常のモデルの後ろにある場合、どちらが上に描画されるかを決定する方法は、それらを描画する順序です。

Quad B の前に Quad A を描画すると、Z 軸で 40 単位小さくても、B は Quad A の上に表示されます。私が言わなければならない非常に混乱しているように見えます!;)

現在、通常のメッシュでこのような問題は発生していません。これは、プリミティブが関与している場合に発生します。まったく同じ問題が通常の線の描画にも当てはまります。

            graphics.DrawUserIndexedPrimitives<VertexPositionColor>(
                PrimitiveType.LineStrip,
                pointList,
                0,  // vertex buffer offset to add to each element of the index buffer
                6,  // number of vertices in pointList
                new short[] { 0, 1 },  // the index buffer
                0,  // first index element to read
                1   // number of primitives to draw

だから私が本当に求めているのは:

A) これは正常ですか?いつ何を描画するかを決定する特別なエンジンを構築する必要がありますか? 私のプロジェクトでは、適切なタイミングで描画することでこれを簡単に回避できますが、できなかったゲームを想像することはできます。たとえば、fps はそのビルボードをいたるところに描画できませんでした! ;)

B) これが正常でない場合、何が原因であり、エラーをデバッグするための解決策/良い方法は何か.

これを整理するための助けをいただければ幸いです!:)

4

2 に答える 2

6

深度バッファがオフになっているようです。おそらく、あなたはスプライトを事前に描いていますか?(SpriteBatch を使用すると、通常の 3D 描画に必要なさまざまなレンダリング状態が変更されます。)

3D オブジェクトを描画する前に、次のコード行を追加してみてください。

GraphicsDevice.RenderState.DepthBufferEnable = true;

関連リンク:

深度バッファー (または「Z バッファー」) の説明については、ウィキペディアの記事を参照してください。

深度バッファを簡単に説明すると、基本的にはシーンのビットマップ イメージであり、各ピクセルが画面のどのくらいの距離 (深度) にあるかを格納します。2 番目のオブジェクトを描画しようとすると、描画しようとしている各ピクセルの「深さ」が最初に計算されます。深度バッファーを使用すると、それらのピクセルの描画がスキップされます。

(通常のメッシュで問題が発生しない理由は、おそらくバックフェース カリングと、メッシュに「オーバーラップ ビット」が後ろから前に描画されていないためです。)

この種のエラー (奇妙なデプス バッファの問題、間違ったレンダリング ステート、およびレンダリングされた出力が期待どおりではない他のほとんどのケース) をデバッグする良い方法として、DirectX SDKをインストールし、 PIX の使用方法を学習することを強くお勧めします。

于 2010-06-22T14:22:25.470 に答える
5

この質問に答えてくれてありがとう!この回答について知りたい他の人のためのフォローアップです。xna 4.0 では、少し変更されました。

一部の 3D タイル オブジェクトは、他の 3D オブジェクトに対して透過的でした。これは、以下が削除されたためです。

GraphicsDevice.RenderState.DepthBufferEnable = true;

XNA 4 では、これは次のように置き換えられました。

DepthStencilState depthBufferState = new DepthStencilState(); 
depthBufferState.DepthBufferEnable = true;
GraphicsDevice.DepthStencilState = depthBufferState;

このソースから取得: http://www.hexworld.co.uk/blog/?cat=9

于 2012-08-15T01:16:40.727 に答える