8

XNAを使用して、3Dモデル上に2Dメニューを作成する必要があります。現在、2D用のスプライトバッチと3Dモデルを作成しました。しかし、私が気づいたように、そして他の場所で言及されたように、zバッファの問題のためにモデルが正しく表示されていません。チュートリアルによると、drawメソッドでDepthBufferを再度有効にすることになっています。しかし、どういうわけか、私が使用するとき:

GraphicsDevice.DepthStencilState.DepthBufferEnable = true;

コードはデバッグ中にエラーをスローし、次のように言います。

読み取り専用のDepthStencilStateは変更できません。状態オブジェクトは、GraphicsDeviceに初めてバインドされたときに読み取り専用になります。プロパティ値を変更するには、新しいDepthStencilStateインスタンスを作成します。

今、私もDepthStencilStateの新しいインスタンスを作成しようとしましたが、それでも機能しないようです。ヘルプドキュメントに読み取り/書き込み値が示されている場合でも、常に同じエラーが発生します。

3Dモデルを正しく表示する方法を理解するのを手伝ってください。

参考までにDrawコードを示します。

protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.Clear(Color.CornflowerBlue);

     Matrix[] transforms = new Matrix[myModel.Bones.Count];
     myModel.CopyAbsoluteBoneTransformsTo(transforms);

     foreach (ModelMesh mesh in myModel.Meshes)
     {
         foreach (BasicEffect effect in mesh.Effects)
         {
             effect.EnableDefaultLighting();

             //effect.DirectionalLight0.Enabled = true;
             //effect.DirectionalLight0.DiffuseColor = Color.AntiqueWhite.ToVector3();
             //effect.DirectionalLight0.Direction = new Vector3(0, 0, 0);

             effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(myModelRotation) * Matrix.CreateTranslation(myModelPosition);
             effect.View = Matrix.CreateLookAt(new Vector3(0, 0, 3000), Vector3.Zero, Vector3.Up);
             effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f),
             GraphicsDevice.Viewport.AspectRatio, 1, 5000);
         }

         mesh.Draw();
    }

    spriteBatch.Begin();
    spriteBatch.Draw(myTexture, new Vector2(0, 0), Color.White);
    spriteBatch.End();

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

    base.Draw(gameTime);
}
4

4 に答える 4

8

デバイスに設定されたDepthStencilStateオブジェクトを変更することはできません。使用する一意の深度/ステンシル設定ごとに、単一のDepthStencilStateオブジェクトを作成する必要があります。最適には、これらの状態はプログラムで1回だけ作成し、必要に応じてデバイスに設定する必要があります。

詳細については、ShawnHargreavesによるXNAGameStudio4.0の状態オブジェクトを参照してください。

追加の詳細:

DepthBufferEnableをtrueに設定していますが、DepthBufferWriteEnableもtrueに設定していません。これらのプロパティを個別に設定するのではなく、フレームワークによって提供されるビルド済みのDepthStencilStateオブジェクトを使用することをお勧めします。モデルをレンダリングする前に、GraphicsDevice.DepthStencilStateをDepthStencilState.Defaultに設定します。これにより、DepthBufferEnableプロパティとDepthBufferWriteEnableプロパティの両方がtrueに設定されます。

また、デバイスのBlendStateをBlendState.Opaqueに設定する必要があります。

SpriteBatch.Begin()は自動的にrenderstateをDepthStencilState.NoneおよびBlendState.AlphaBlendに変更するため、モデルを描画する前にこれらのrenderstatesを設定する必要があります(SpriteBatch.BeginのMSDNドキュメントを参照)。

于 2011-02-15T01:44:32.337 に答える
4

解決策は、3Dレンダリングコードの前に次を追加することです。

GraphicsDevice.DepthStencilState = DepthStencilState.Default;
于 2011-08-12T14:06:40.460 に答える
1

投稿する前にこのコードをテストしました。新しいDepthStencilStateを作成することにより、次のようにGraphicsDeviceプロパティを新しい状態に設定できます。


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

于 2011-02-15T01:40:39.517 に答える
0

Empyreanが言ったように、あなたがする必要があるのは、Draw()関数でモデルを描くために使用するコードのすぐ上に次のコード行を配置することです。

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

于 2011-03-09T00:01:35.773 に答える