0

好吧,伙计们,这个真的让我心烦意乱,因为我已经能够很好地渲染模型(实际上我必须这样做才能测试我的相机)。

然而,现在我试图从顶点和索引缓冲区中绘制一个立方体,它就是行不通的。(我已经能够绘制三角形等,但从来没有从他们自己的班级)。

我的最终目标是能够构建 64x64x8 立方体的区域来创建游戏世界。(不是我的世界克隆,实际上是 RTS——它会有一种“2d”的感觉,因为游戏世界本身只有 8 个立方体深,但我离题了)。

通过查看整个网络上的各种索引和顶点教程,在我看来这应该可以工作。这是一些代码......

游戏.cs

    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if(GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        // TODO: Add your update logic here
        float timeDifference = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
        cam.Update(timeDifference);
        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here

        cube = new CubeShape(Color.Black, new Vector3(0, 0, 0), GraphicsDevice);


        RasterizerState rasterizerState = new RasterizerState();
        rasterizerState.CullMode = CullMode.None;
        GraphicsDevice.RasterizerState = rasterizerState;

        cube.Render(cam.viewMatrix,cam.projectionMatrix);
        base.Draw(gameTime);
    }
}

还有我的立方体(这个有点长,抱歉)

class CubeShape
{
    //Transform later to have static v and i buffers.
    private VertexBuffer vBuffer;
    public VertexBuffer VBuffer
    { get { return vBuffer; } set { vBuffer = value; } }

    private IndexBuffer iBuffer;
    public IndexBuffer IBuffer
    { get { return iBuffer; } set { iBuffer = value; } }

    private BasicEffect bEffect;
    public BasicEffect BEffect
    { get { return bEffect; } set { bEffect = value; } }

    private Matrix world;
    public Matrix World
    { get { return world; } set { world = value; } }

    private Matrix view;
    public Matrix View
    { get { return view; } set { view = value; } }

    private Matrix projection;
    private Matrix Projection
    { get { return projection; } set { projection = value; } }

    private Color color;
    public Color Color
    { get { return color; } set { color = value; } }

    private Vector3 position;
    public Vector3 Position
    { get { return position; } set { position = value; } }

    //Need to change this eventually to use textures.
    private VertexPositionColor[] vertices;
    byte[] indices;


    private GraphicsDevice device;
    //constructors!
    public CubeShape(Color inColor,Vector3 inPosition,GraphicsDevice inDevice)
    {
        device = inDevice;


        this.color = inColor;
        this.position = inPosition;
        SetUpVertices();
        SetUpIndices();
        //world = Matrix.CreateTranslation(position);
        world = Matrix.CreateTranslation(0, 0, 0);
        bEffect = new BasicEffect(device);
        bEffect.World = world;
        bEffect.VertexColorEnabled = true;
    }
    //end constructors!

    // >.<
    public void Render(Matrix view,Matrix projection)
    {
        bEffect.View = view;
        bEffect.Projection = projection;


        device.SetVertexBuffer(vBuffer);
        device.Indices = IBuffer;

        foreach(EffectPass pass in bEffect.CurrentTechnique.Passes)
        {
            pass.Apply();
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 8, 0, 12);
        }
    }

    /// <summary>
    /// Sets up the vertices for a cube using 8 unique vertices.
    /// Build order is front to back, left to up to right to down.
    /// </summary>
    private void SetUpVertices()
    {
        vertices = new VertexPositionColor[8];

        //front left bottom corner
        vertices[0] = new VertexPositionColor(new Vector3(0, 0, 0), color);
        //front left upper corner
        vertices[1] = new VertexPositionColor(new Vector3(0, 100, 0), color);
        //front right upper corner
        vertices[2] = new VertexPositionColor(new Vector3(100, 100, 0), color);
        //front lower right corner
        vertices[3] = new VertexPositionColor(new Vector3(100, 0, 0), color);
        //back left lower corner
        vertices[4] = new VertexPositionColor(new Vector3(0, 0, -100), color);
        //back left upper corner
        vertices[5] = new VertexPositionColor(new Vector3(0, 100, -100), color);
        //back right upper corner
        vertices[6] = new VertexPositionColor(new Vector3(100, 100, -100), color);
        //back right lower corner
        vertices[7] = new VertexPositionColor(new Vector3(100, 0, -100), color);

        vBuffer = new VertexBuffer(device, typeof(VertexPositionColor), 8, BufferUsage.WriteOnly);
        vBuffer.SetData<VertexPositionColor>(vertices);
    }

    /// <summary>
    /// Sets up the indices for a cube. Has 36 positions that match up
    /// to the element numbers of the vertices created earlier.
    /// Valid range is 0-7 for each value.
    /// </summary>
    private void SetUpIndices()
    {
        indices = new byte[36];

        //Front face
        //bottom right triangle
        indices[0] = 0;
        indices[1] = 3;
        indices[2] = 2;
        //top left triangle
        indices[3] = 2;
        indices[4] = 1;
        indices[5] = 0;
        //back face
        //bottom right triangle
        indices[6] = 4;
        indices[7] = 7;
        indices[8] = 6;
        //top left triangle
        indices[9] = 6;
        indices[10] = 5;
        indices[11] = 4;
        //Top face
        //bottom right triangle
        indices[12] = 1;
        indices[13] = 2;
        indices[14] = 6;
        //top left triangle
        indices[15] = 6;
        indices[16] = 5;
        indices[17] = 1;
        //bottom face
        //bottom right triangle
        indices[18] = 4;
        indices[19] = 7;
        indices[20] = 3;
        //top left triangle
        indices[21] = 3;
        indices[22] = 0;
        indices[23] = 4;
        //left face
        //bottom right triangle
        indices[24] = 4;
        indices[25] = 0;
        indices[26] = 1;
        //top left triangle
        indices[27] = 1;
        indices[28] = 5;
        indices[29] = 4;
        //right face
        //bottom right triangle
        indices[30] = 3;
        indices[31] = 7;
        indices[32] = 6;
        //top left triangle
        indices[33] = 6;
        indices[34] = 2;
        indices[35] = 3;

        iBuffer = new IndexBuffer(device, typeof(short), 36, BufferUsage.WriteOnly);
        iBuffer.SetData(indices);
    }
}

我真的不知道为什么这不起作用。可能是因为过去 4 小时我一直在盯着代码看>.<

哦,相机从 0,0,50 开始,面向 0,0,0。它还允许我使用鼠标和键盘(就像任何 rts cam 一样)旋转(按住鼠标中键)。我四处寻找只是为了确保我的立方体不在我的视野范围之外,但我看到的都是蓝色>。<

我很感激这里的任何帮助。

ps 作为第二个问题,关于如何在多维数据集之间共享缓冲区的任何提示?我读到,因为立方体的几何形状永远不会改变,所以共享缓冲区更有效,但我不确定如何去做......创建一个相当大的缓冲区并用某种列表类中的立方体填充它可能包含所有需要渲染的立方体?甚至不知道从哪里开始寻找。再次,非常感谢任何输入/建议。

4

1 回答 1

0

看起来你有一些打字问题。我通过更改以下代码使其工作:

//byte[] indices;
short[] indices;

//indices = new byte[36];
indices = new short[36];

//iBuffer = new IndexBuffer(device, typeof(short), 36, BufferUsage.WriteOnly);
iBuffer = new IndexBuffer(device, IndexElementSize.SixteenBits, sizeof(short) * indices.Length, BufferUsage.WriteOnly);

如果它仍然不起作用,对我大喊大叫,我会检查以确保我没有错过任何东西。请记住,我不得不使用我自己的相机类之一,因为你没有包括你的。

我不知道如何回答你的第二个问题。您可能想将其作为一个单独的问题提出。

于 2012-02-26T17:59:41.273 回答