1

我有生以来第一次看到 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 有什么意义呢?:-)

(我敢肯定这是一个重点——请帮我看看!!!:)

问题解决了:蹩脚的 XNA 书!谢谢@dowhilefor

4

2 回答 2

4

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

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

于 2011-09-06T11:55:00.813 回答
1

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

当您必须绘制大量顶点时,将它们存储在 gpu 内存中会更有效。

于 2011-09-06T11:54:31.520 回答