2014-02-10 101 views
1

我已经精疲力尽了我的大脑,并且来找你寻求帮助。Monogame顶点缓冲区代理怪异

我最近开始研究一个项目来测试Monogame,并且很快遇到了一个问题,我不确定这是我的错还是Mono的。

我有一个系统,其中一个级别有一堆静态实例添加到它(几何),然后这个几何被保存到一个单独的类来呈现所有。该计划是使用顶点和索引缓冲区并使用GraphicsDevice.DrawPrimitives,但这是我遇到的问题。

顶部图像是它应该是什么样子,底部一个就是它实际上是这样的:

What it looks like when using array mode What it looks like when using buffer mode

这里是相关的代码。现在将模式设置为Array可以正常工作,但Buffer会混乱,所以我知道顶点被正确添加,并且数组是正确的,效果是正确的,只有缓冲区是错误的。

public void End() 
    { 
     _vertices = _tempVertices.ToArray(); 
     _vCount = _vertices.Length; 
     _indices = _tempIndices.ToArray(); 
     _iCount = _indices.Length; 

     _vBuffer = new VertexBuffer(_graphics, typeof(VertexPositionColorTexture), 
      _vCount, BufferUsage.WriteOnly); 
     _vBuffer.SetData(_vertices, 0, _vCount); 

     _iBuffer = new IndexBuffer(_graphics, IndexElementSize.ThirtyTwoBits, 
      _iCount, BufferUsage.WriteOnly); 
     _iBuffer.SetData(_indices, 0, _iCount); 

     _tempIndices.Clear(); 
     _tempVertices.Clear(); 

     _primitiveCount = _iCount/3; 

     _canDraw = true; 
    } 

    public void Render() 
    { 
     if (_canDraw) 
     { 
      switch (DrawMode) 
      { 
       case Mode.Buffered: 
        _graphics.Indices = _iBuffer; 
        _graphics.SetVertexBuffer(_vBuffer); 

        _graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, _primitiveCount); 
        break; 

       case Mode.Array: 
        _graphics.DrawUserIndexedPrimitives<VertexPositionColorTexture> 
         (PrimitiveType.TriangleList, _vertices, 0, _vCount, 
         _indices, 0, _primitiveCount); 
        break; 
      } 
     } 
     else 
      throw new InvalidOperationException("End must be called before this can be rendered"); 
    } 

任何人有任何想法我在这里失踪?谢谢。

回答

2

我想通了,经过几个小时的尝试。我可能实际上是一个白痴。

而不是使用索引绘图,我只是试图绘制非索引基元。

在渲染()方法,我只是改变

_graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, _primitiveCount); 

到:

_graphics.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, _vCount, 0, _primitiveCount); 

瞧,这一切工作了。

+0

这让我头撞墙壁了好几个小时。感谢您发布自己的问题的答案! – shambulator