2009-07-11 5 views
3

Je tente de rendre un quad texturé en utilisant l'exemple situé here.Dessiner un quad texturé à l'aide de XNA

Je peux réussir le quadruplé, mais les informations de texture semblent être perdues. Le quad prend la couleur de la texture sous-jacente, cependant.

J'ai vérifié les problèmes évidents ("Est-ce que BasicEffect rend le quad a la propriété TextureEnabled définie sur true?") Et ne peut pas voir immédiatement le problème.

code

ci-dessous:

public class Quad 
{ 
    public VertexPositionNormalTexture[] Vertices; 
    public Vector3 Origin; 
    public Vector3 Up; 
    public Vector3 Normal; 
    public Vector3 Left; 
    public Vector3 UpperLeft; 
    public Vector3 UpperRight; 
    public Vector3 LowerLeft; 
    public Vector3 LowerRight; 
    public int[] Indexes; 


    public Quad(Vector3 origin, Vector3 normal, Vector3 up, 
     float width, float height) 
    { 
     this.Vertices = new VertexPositionNormalTexture[4]; 
     this.Indexes = new int[6]; 
     this.Origin = origin; 
     this.Normal = normal; 
     this.Up = up; 

     // Calculate the quad corners 
     this.Left = Vector3.Cross(normal, this.Up); 
     Vector3 uppercenter = (this.Up * height/2) + origin; 
     this.UpperLeft = uppercenter + (this.Left * width/2); 
     this.UpperRight = uppercenter - (this.Left * width/2); 
     this.LowerLeft = this.UpperLeft - (this.Up * height); 
     this.LowerRight = this.UpperRight - (this.Up * height); 

     this.FillVertices(); 
    } 

    private void FillVertices() 
    { 
     Vector2 textureUpperLeft = new Vector2(0.0f, 0.0f); 
     Vector2 textureUpperRight = new Vector2(1.0f, 0.0f); 
     Vector2 textureLowerLeft = new Vector2(0.0f, 1.0f); 
     Vector2 textureLowerRight = new Vector2(1.0f, 1.0f); 

     for (int i = 0; i < this.Vertices.Length; i++) 
     { 
      this.Vertices[i].Normal = this.Normal; 
     } 

     this.Vertices[0].Position = this.LowerLeft; 
     this.Vertices[0].TextureCoordinate = textureLowerLeft; 
     this.Vertices[1].Position = this.UpperLeft; 
     this.Vertices[1].TextureCoordinate = textureUpperLeft; 
     this.Vertices[2].Position = this.LowerRight; 
     this.Vertices[2].TextureCoordinate = textureLowerRight; 
     this.Vertices[3].Position = this.UpperRight; 
     this.Vertices[3].TextureCoordinate = textureUpperRight; 

     this.Indexes[0] = 0; 
     this.Indexes[1] = 1; 
     this.Indexes[2] = 2; 
     this.Indexes[3] = 2; 
     this.Indexes[4] = 1; 
     this.Indexes[5] = 3; 
    } 
} 

this.quadEffect = new BasicEffect(this.GraphicsDevice, null); 
this.quadEffect.AmbientLightColor = new Vector3(0.8f, 0.8f, 0.8f); 
this.quadEffect.LightingEnabled = true; 
this.quadEffect.World = Matrix.Identity; 
this.quadEffect.View = this.View; 
this.quadEffect.Projection = this.Projection; 
this.quadEffect.TextureEnabled = true; 
this.quadEffect.Texture = someTexture; 

this.quad = new Quad(Vector3.Zero, Vector3.UnitZ, Vector3.Up, 2, 2); 

this.quadVertexDecl = new VertexDeclaration(this.GraphicsDevice, VertexPositionNormalTexture.VertexElements); 

public override void Draw(GameTime gameTime) 
{ 
    this.GraphicsDevice.Textures[0] = this.SpriteDictionary["B1S1I800"]; 
    this.GraphicsDevice.VertexDeclaration = quadVertexDecl; 
    quadEffect.Begin(); 

    foreach (EffectPass pass in quadEffect.CurrentTechnique.Passes) 
    { 
     pass.Begin(); 
     GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionNormalTexture>(
      PrimitiveType.TriangleList, 
      beamQuad.Vertices, 0, 4, 
      beamQuad.Indexes, 0, 2); 

     pass.End(); 
    } 

    quadEffect.End(); 
} 

Répondre

1

D'après ce que je peux voir, cela devrait fonctionner. La seule chose que je peux imaginer, qui n'est pas dans ce code, c'est que le chargement de la texture se passe mal quelque part. Je ne peux pas non plus tout à fait visualiser ce que vous voulez dire que le quad a la couleur sous-jacente de la texture? Avez-vous une capture d'écran pour nous?

De même, si quelque chose apparaît, une version très déformée de votre texture par exemple, il pourrait être possible que le rendu de autres trucs ait un effet sur le rendu du quad. Par exemple si vous dessinez le quad tandis que le périphérique graphique a une autre déclaration de vertex, ou si la chose précédente a rendu un état de rendu exotique, ou si vous dessinez le quad dans le code de dessin d'autre chose. Essayez d'isoler ce code, dans un nouveau projet ou quelque chose, ou désactivez le rendu de tout le reste.

+0

La chose précédente a en effet mis un état de rendu exotique. Le code ci-dessus est plus ou moins correct, mais j'ai oublié de mentionner que j'utilisais BasicEffect en conjonction avec un SpriteBatch, qui mute l'état de rendu. J'avais supposé à tort que le SpriteBatch était sans effets secondaires. –