使用XNA绘制纹理四边形

时间:2009-07-11 01:26:12

标签: c# xna

我正在尝试使用位于here的示例渲染纹理四边形。

我可以成功渲染四边形,但纹理信息似乎丢失了。然而,四边形采用底层纹理的颜色。

我已经检查了明显的问题(“渲染四边形的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();
}

1 个答案:

答案 0 :(得分:1)

从我所看到的,这应该有效。我能想象到的唯一不在于此代码的是纹理的加载在某处出错。我也无法想象你的意思是四边形有纹理的底层颜色?你有截图吗?

此外,如果某些内容确实显示,例如纹理的扭曲版本,则其他内容的渲染可能会影响四边形的渲染。例如,如果你绘制四边形,而图形设备上有另一个顶点声明,或者前一个渲染的东西设置了一些异国情调的渲染状态,或者你在其他东西的绘图代码中绘制四边形。尝试将此代码隔离到新项目或其他内容中,或禁用其他所有内容的呈现。