2014-02-10 2 views
1

Я исчерпал свой мозг и пришел к вам за помощью.Monogame Vertex Buffer действует weird

Недавно я начал работу над проектом для тестирования Monogame и быстро столкнулся с проблемой, я не уверен, что это моя ошибка или Моно.

У меня есть система, в которой уровень содержит кучу добавленных к нему статических экземпляров (геометрия), тогда эта геометрия сохраняется в отдельном классе, чтобы отобразить все. План состоял в том, чтобы использовать вершинные и индексные буферы и использовать 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

Я понял, после нескольких часов попробовать все. На самом деле я могу быть идиотом.

Вместо использования индексированного чертежа я просто пытался рисовать неиндексированные примитивы.

В методе Render(), я просто изменил

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

к:

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

И вуаля, все работает сейчас.

+0

Это заставило меня биться головой о стену часами. Спасибо, что ответили на свой вопрос! – shambulator