我在生命中第一次看XNA,我对我读过的例子感到困惑。它们包含我不理解的重复:
protected override void LoadContent()
{
_verts1 = new VertexPositionTexture[6];
_vertexBuffer1 = new VertexBuffer(
GraphicsDevice,
typeof(VertexPositionTexture),
_verts1.Length,
BufferUsage.None);
_vertexBuffer1.SetData(_verts1);
...
}
protected override void Draw(GameTime gameTime)
{
...
GraphicsDevice.SetVertexBuffer(_vertexBuffer1);
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.DrawUserPrimitives<VertexPositionTexture>(
PrimitiveType.TriangleStrip,
_verts1,
0,
4);
}
...
}
我不明白为什么在绘图方法中使用了VertexBuffer和VertexPositionTexture。并不足以保持VertexBuffer的存在吗?
如果我删除对GraphicsDevice.SetVertexBuffer的调用并且只依赖于GraphicsDevice.DrawUserPrimitives - 一切看起来都一样!那么:当我只能使用VertexPositionTexture []时,拥有一个VertexBuffer是什么意思? : - )
(我确定这是一个点 - plaese帮助我看到它!!!)
问题解决了:糟糕的XNA书!谢谢@dowhilefor
答案 0 :(得分:4)
首先,包含顶点的数组只能使用DrawUserPrimitives进行渲染,因为您可以每帧更改数组,因此每次都会将顶点推送到图形卡,因此速度要慢得多。 Vertexbuffer用于为顶点创建存储并将其放在图形卡上一次。这当然使数据保持静态,但速度也快得多。事实上,我猜DrawUserPrimitives会自己为顶点数据创建一个VertexBuffer。
所以你要混合两种不同的东西。您创建了一个顶点缓冲区,设置它然后渲染您的数组。看看DrawPrimitives。
答案 1 :(得分:1)
VertexPositionTexture顶点存储在主内存中, 并且顶点缓冲区将顶点存储在gpu(图形)内存中。
当你必须绘制很多顶点时,将它们存储在gpu内存中会更有效。