Борьба с вершинными и индексными буферами в Direct3D - PullRequest
9 голосов
/ 03 февраля 2011

Я много месяцев пытался узнать, как работают IDirect3DVertexBuffer9 и IDirect3DIndexBuffer9.Я прочитал несколько книг, электронных книг и форумов, и до сих пор не могу понять, как они работают.Может ли кто-нибудь помочь мне понять, как они работают и как они связаны друг с другом?

PS: я пробовал искать похожие вопросы, но ничего меня не интересовало.

Спасибо.

Ответы [ 2 ]

20 голосов
/ 07 февраля 2011

Это поначалу меня тоже смутило. Еще один способ думать об этом визуально (я большой визуальный мыслитель, так что, возможно, это вам тоже поможет).

Развернемся на примере Зезбы, скажем, мы хотим нарисовать четырехугольник, используя два треугольника:

Quad

Как он / она указал, это можно сделать всего четырьмя вершинами. Таким образом, ваш буфер вершин будет содержать только ЧЕТЫРЕ записи. Я обозначу эти {A, B, C, D}:

Quad with vertices: A, B, C, D

Однако, поскольку графические процессоры имеют дело с треугольниками, нам все еще нужно определить группировки из ТРИ вершин, чтобы сообщить GPU, как создавать треугольники из списка уже определенных вершин. Это цель индексного буфера.

Вы можете думать о буфере индексов просто как о списке индексов в буфере вершин, который определяет треугольники. Таким образом, поскольку мы формируем два треугольника, и каждому треугольнику нужны три вершины, для индексного буфера потребуется шесть записей.

Здесь немного важен и порядок. Я не буду вдаваться в подробности, но давайте просто скажем, что я хочу определить свои треугольники против часовой стрелки . Я определю два моих треугольника как {B, A, C} и {B, C, D} . Можно прекрасно использовать вершины для нескольких треугольников.

Итак, мои буферы выглядят так:

Quad with vertex and index buffers

Надеюсь, это поможет.

7 голосов
/ 03 февраля 2011

IndexBuffers используются для оптимизации памяти и скорости. IndexBuffer - это список индексов, которые индексируют вершины в vertexBuffer.

Скажем, я собираюсь визуализировать плоский квад на 2 треугольниках. Каждый треугольник занимает 3 вершины, поэтому для рендеринга четырехугольника с помощью только VertexBuffer мне понадобится 6 вершин.

Теперь, если я использую IndexBuffer, мне нужно будет использовать только 4 вершины (по одной на каждый угол четырехугольника). Но мне нужно 6 индексов, по 3 индекса для каждого треугольника, которые будут индексировать одну из угловых вершин.

На больших моделях это может сэкономить память и значительно повысить скорость, поскольку графический процессор будет обрабатывать меньше вершин.

Вот сайт с хорошим примером кода: * http://www.codesampler.com/dx9src.htm Там загрузите образец "Indexed Geometry".

...