2010-12-15 3 views
0

Je suis en train d'essayer de comprendre comment fonctionne le rendu 3D dans XNA, il semble être très similaire à DirectX, ce qui le rend assez simple .Dans XNA/WP7, dessiner 2D sur 3D crée un rendu 3D bancal pour moi

Mais il y a un type de comportement auquel je ne m'attendais pas lorsque je dessinais avec des lots de sprites.

Lorsque je viens de dessiner la primitive, un cube en 3D, sans sprites j'obtenir ce résultat: http://i.stack.imgur.com/DQAHg.png

Mais quand je suis en train de tirer sur le dessus de sprites 2D (tirée de SpriteBatch) dans ce qui suit Mode:

 SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
     base.Draw(gameTime); 
     SpriteBatch.End(); 

     shape.Draw(gameTime); 

Ceci est le résultat que je reçois: http://imgur.com/7QZlj

Ce qui est évidemment faux. Ma première pensée était que c'était le rendu utilisant la projection orthographique (pour une raison quelconque) mais je ne suis pas sûr.

Voici le code que j'utilise pour dessiner le cube, il est presque 1: 1 de l'échantillon de primitives XNA (je ne l'ai pas commencé à travailler sur un bon cadre 3D pour le jeu) il peut être salissant

  GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; 

      // Create camera matrices, making the object spin. 
      float time = (float)gameTime.TotalGameTime.TotalSeconds; 

      Vector3 cameraPosition = new Vector3(0, 0, 2.5f); 

      float aspect = GraphicsDevice.Viewport.AspectRatio; 

      float yaw = 3.05f; 
      float pitch = 5.34f; 
      float roll = 8.396f; 

      Matrix world = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll); 
      Matrix view = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up); 
      Matrix projection = Matrix.CreatePerspectiveFieldOfView(1, aspect, 1, 10); 

      // currentPrimitive.Draw(world, view, projection, Color.Red); 

      // Reset the fill mode renderstate. 
      GraphicsDevice.RasterizerState = RasterizerState.CullClockwise; 


      Color color = Color.Red; 

      // Set BasicEffect parameters. 
      basicEffect.World = world; 
      basicEffect.View = view; 
      basicEffect.Projection = projection; 
      basicEffect.DiffuseColor = color.ToVector3(); 
      basicEffect.Alpha = 1.0f;// color.A/255.0f; 

      GraphicsDevice device = basicEffect.GraphicsDevice; 
      device.DepthStencilState = DepthStencilState.Default; 


      GraphicsDevice.RasterizerState = RasterizerState.CullClockwise; 

      GraphicsDevice graphicsDevice = basicEffect.GraphicsDevice; 

      // Set our vertex declaration, vertex buffer, and index buffer. 
      graphicsDevice.SetVertexBuffer(vertexBuffer); 

      graphicsDevice.Indices = indexBuffer; 


      foreach (EffectPass effectPass in basicEffect.CurrentTechnique.Passes) 
      { 
       effectPass.Apply(); 

       int primitiveCount = indices.Count/3; 

       graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 
                vertices.Count, 0, primitiveCount); 

      } 

Je devrais aussi clarifier, ce n'est pas le résultat de spritebatch.begin/spritebatch.end, si je commence juste/fin et ne dessine rien, le résultat final est bon, mais si je dessine une police ou un sprite, il casse le cube.

Vous avez des idées?

Répondre

1

Mon conseil serait de vérifier les paramètres GraphicsDevice après avoir fait votre appel de méthode SpriteBatch.End(). Lorsque vous utilisez SpriteBatch, cela modifie certains états de rendu dans le GraphicsDevice. Il vaut sans doute la peine de stocker les valeurs du GraphicsDevice avant le SpriteBatch.Begin(), puis de les réinitialiser après les appels de méthode SpriteBatch.End().

+0

Ceci a résolu le problème, il changeait l'ordre d'enroulement de réforme. – tweetypi

+1

J'ai eu un problème similaire (http://project-vanquish.co.cc) qui a causé beaucoup de frustration. –