使用XNA绘制质感四边形

问题描述:

我正在尝试使用位于here的示例渲染质感四边形。使用XNA绘制质感四边形

我可以成功渲染四边形,但纹理信息似乎已丢失。尽管如此,四边形还是会获得底层纹理的颜色。

我已经检查了显而易见的问题(“BasicEffect呈现四边形是否将TextureEnabled属性设置为true?”),并且无法立即看到问题。下面

代码:

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(); 
} 

从我所看到的,这应该工作。我可以想象的唯一的事情是,这个代码中没有的地方是,纹理的加载出错了。我也无法完全想象你的意思是四边形是否具有纹理的底色?你有我们的截图吗?另外,如果出现某种情况,例如纹理的扭曲版本,则可能会渲染其他材质对四边形的渲染有影响。例如,如果您绘制四边形,而图形设备上有另一个顶点声明,或者前面的事情设置了一些异国情调的渲染状态,或者您正在其他绘图代码中绘制四边形。尝试将此代码隔离到新项目中,或禁用其他所有内容的渲染。

+0

以前的事情确实确定了异国情调的渲染状态。上面的代码或多或少是正确的,但我忽略了提到我正在将BasicEffect与SpriteBatch结合使用,这会改变渲染状态。我错误地认为SpriteBatch是无副作用的。 – 2010-10-06 18:34:47