2014-02-10 146 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