Вопрос для начинающих о VertexBuffers - PullRequest
1 голос
/ 06 сентября 2011

Я впервые в жизни смотрю на 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 - все выглядит одинаково! Итак: какой смысл иметь VertexBuffer, когда я могу обойтись, просто используя VertexPositionTexture []? : -)

(Я уверен, что это точка зрения - пожалуйста, помогите мне увидеть это !!!:)

Проблема решена: дрянная книга XNA! Спасибо @ dowhilefor

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

Прежде всего, ваш массив, содержащий вершины, может быть отрисован только с DrawUserPrimitives, который намного медленнее, потому что вы можете изменять свой массив каждый кадр, таким образом, ваши вершины каждый раз передаются на графическую карту.Vertexbuffer - это создание хранилища для ваших вершин и размещение их на графической карте один раз.Это, конечно, делает данные статичными, но и намного быстрее.На самом деле, я думаю, DrawUserPrimitives самостоятельно создает VertexBuffer для ваших данных вершин.

Так что вы смешиваете две разные вещи.Вы создали буфер вершин, установили его, но затем визуализировали ваш массив.Взгляните на DrawPrimitives .

1 голос
/ 06 сентября 2011

Вершины VertexPositionTexture хранятся в основной памяти, и вершинный буфер хранит вершину в памяти графического процессора.

Когда вам нужно нарисовать много вершин, более эффективно хранить их в памяти GPU.

...