为什么我没有看到在XNA中绘制的实例蓝框?

时间:2014-02-26 22:12:54

标签: c# winforms xna vertex-buffer

我的实例在下面出了什么问题?我正在尝试使用顶点颜色绘制单个框的多个实例。我根据使用的纹理和着色器而不是顶点颜色调整了此代码的示例。所以我怀疑我在使用VertexPositionColor或使用BasicEffect时出错了。我不需要纹理,所以我试图删除着色器。我还应该提到这是winforms应用程序的一部分。

我从这段代码中得到的是一个大红色X,表明出现了严重错误。

我在这里缺少什么?显然有一些我不理解的东西。

namespace Die
{
class DieRender
{
    VertexDeclaration instanceVertexDeclaration;

    VertexBuffer dieGeometryBuffer;
    IndexBuffer dieIndexBuffer;

    VertexBuffer instanceBuffer;

    VertexBufferBinding[] bindings;
    InstanceInfo[] instances;

    int instanceCount = 3;

    struct InstanceInfo
    {
        public Vector4 World;
    };

    public void Initialize(GraphicsDevice device) {
        GenerateInstanceVertexDeclaration();
        GenerateDieGeometry(device, Color.Blue);
        GenerateInstanceInformation(device, instanceCount);

        bindings = new VertexBufferBinding[2];
        bindings[0] = new VertexBufferBinding(dieGeometryBuffer);
        bindings[1] = new VertexBufferBinding(instanceBuffer, 0, 1);
    }

    private void GenerateInstanceVertexDeclaration() {
        VertexElement[] instanceStreamElements = new VertexElement[1];

        instanceStreamElements[0] =
                new VertexElement(0, VertexElementFormat.Vector4,
                    VertexElementUsage.Position, 1);

        instanceVertexDeclaration = new VertexDeclaration(instanceStreamElements);
    }

    public void GenerateDieGeometry(GraphicsDevice device, Color color) {
        VertexPositionColor[] vertices = new VertexPositionColor[4];
        int[] indices = new int[6];

        vertices[0].Position = new Vector3(-1, 1, 0);
        vertices[1].Position = new Vector3(1, 1, 0);
        vertices[2].Position = new Vector3(-1, -1, 0);
        vertices[3].Position = new Vector3(1, -1, 0);
        for (int i = 0; i < vertices.Count(); i++)
            vertices[i].Color = color;

        dieGeometryBuffer = new VertexBuffer(device,VertexPositionColor.VertexDeclaration,
            4, BufferUsage.WriteOnly);
        dieGeometryBuffer.SetData(vertices);

        indices[0] = 0; indices[1] = 1; indices[2] = 2;
        indices[3] = 1; indices[4] = 3; indices[5] = 2;

        dieIndexBuffer = new IndexBuffer(device, typeof(int), 6, BufferUsage.WriteOnly);
        dieIndexBuffer.SetData(indices);
    }

    private void GenerateInstanceInformation(GraphicsDevice device, Int32 count) {
        instances = new InstanceInfo[count];
        Random rnd = new Random();

        for (int i = 0; i < count; i++) {
            instances[i].World = new Vector4(-rnd.Next(20),
                                             -rnd.Next(20),
                                             -rnd.Next(20), 0);

        }

        instanceBuffer = new VertexBuffer(device, instanceVertexDeclaration,
                                          count, BufferUsage.WriteOnly);
        instanceBuffer.SetData(instances);
    }

    public void Draw(Matrix world, Matrix view, Matrix projection, GraphicsDevice device) {
        device.Clear(Color.White);

        BasicEffect effect = new BasicEffect(device);
        effect.EnableDefaultLighting();
        effect.TextureEnabled = false;
        effect.World = world;
        effect.View = view;
        effect.Projection = projection;
        effect.VertexColorEnabled = true;

        device.Indices = dieIndexBuffer;
        device.SetVertexBuffers(bindings);

        foreach (EffectPass pass in effect.CurrentTechnique.Passes) {
            pass.Apply();
            device.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2, instanceCount);
        }

    }
}
}

1 个答案:

答案 0 :(得分:2)

啊!我发现它......几天来一直在努力,并在我发布问题后立即发现问题。

在启用CLR的异常后,我发现了异常并发现了类似的问题:XNA: The current vertex declaration does not include all the elements required by the current vertex shader. Normal0 is missing

对不起,如果我浪费了任何人的时间。

现在......继续下一个bug。