Draw a textured square using XNA

I am trying to make a textured square using the example here .

I can successfully complete the square, but the texture information seems lost. The square takes the color of the main texture, however.

I checked for obvious problems ("Does BasicEffect provide a square for the TextureEnabled property equal to true?") And cannot immediately see the problem.

Code below:

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(); } 
+4
source share
1 answer

From what I see, this should work. The only thing I can imagine that is not in this code is that something is wrong when loading the texture. I also can not imagine that you mean that the square has the main color of the texture? Do you have a screenshot for us?

In addition, if something appears, a very distorted version of your texture, for example, it is possible that the rendering of another material affects the rendering of the quadrant. For example, if you draw a quad while the graphic device has another vertex declaration on it, or if the previous thing is rendered, set some exotic rendering state or if you draw a square in the drawing code for something else. Try isolating this code into a new project or something else, or turn off the rendering of everything else.

+1
source

All Articles