Monogame Vertex Buffer表现得很奇怪

时间:2014-02-10 19:50:30

标签: c# graphics monogame

我已经筋疲力尽了,来找你帮忙。

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

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

顶部图像应该是它​​的样子,底部图像实际上是它的样子:

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

这是相关的代码。现在将模式设置为Array工作正常,但缓冲区搞砸了,所以我知道顶点正在添加,数组是正确的,效果是正确的,只有缓冲区是错误的。

    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");
    }

任何人都知道我在这里缺少什么?感谢。

1 个答案:

答案 0 :(得分:2)

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

我没有使用索引绘图,而只是尝试绘制非索引图元。

在Render()方法中,我只是改变了

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

为:

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

瞧,现在一切正常。