Z проблема с буфером путем смешивания двухмерных спрайтов с трехмерной моделью

Мне нужно создать 2-мерное меню поверх 3-х мерной модели, используя XNA. Прямо сейчас я создал пакет спрайтов для 2D и 3D-модели. Но, как я заметил и упоминалось в других местах, модель не отображается должным образом из-за проблемы с z-буфером. Согласно руководству, я должен снова включить 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);
}
8
задан Omar 13 December 2012 в 20:20
поделиться