初学者对VertexBuffers有疑问

时间:2011-09-06 11:50:24

标签: xna vertex-buffer

我在生命中第一次看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

2 个答案:

答案 0 :(得分:4)

首先,包含顶点的数组只能使用DrawUserPrimitives进行渲染,因为您可以每帧更改数组,因此每次都会将顶点推送到图形卡,因此速度要慢得多。 Vertexbuffer用于为顶点创建存储并将其放在图形卡上一次。这当然使数据保持静态,但速度也快得多。事实上,我猜DrawUserPrimitives会自己为顶点数据创建一个VertexBuffer。

所以你要混合两种不同的东西。您创建了一个顶点缓冲区,设置它然后渲染您的数组。看看DrawPrimitives

答案 1 :(得分:1)

VertexPositionTexture顶点存储在主内存中, 并且顶点缓冲区将顶点存储在gpu(图形)内存中。

当你必须绘制很多顶点时,将它们存储在gpu内存中会更有效。