我已经筋疲力尽了,来找你帮忙。
我最近开始研究测试Monogame的项目,很快就遇到了问题,我不确定这是我的错还是Mono的。
我有一个系统,其中一个级别添加了一堆静态实例(几何体),然后将这个几何体保存到一个单独的类来渲染它。计划是使用顶点和索引缓冲区并使用GraphicsDevice.DrawPrimitives,但这是我遇到问题的地方。
顶部图像应该是它的样子,底部图像实际上是它的样子:
这是相关的代码。现在将模式设置为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");
}
任何人都知道我在这里缺少什么?感谢。
答案 0 :(得分:2)
经过几个小时的努力,我想通了。我可能实际上是个白痴。
我没有使用索引绘图,而只是尝试绘制非索引图元。
在Render()方法中,我只是改变了
_graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, _primitiveCount);
为:
_graphics.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, _vCount, 0, _primitiveCount);
瞧,现在一切正常。