Буфер индексов (Index Buffer)
Буфер индексов (Index Buffer) — буфер, определяющий порядок следования вершин при построении геометрии. Индексный буфер представляет собой массив индексов — «номеров» вершин в вершинном буфере.
Отрисовка с использованием буфера индексов — один из вариантов отрисовки геометрии. В 3д моделях многие вершины принадлежат сразу нескольким треугольникам. Для того чтобы не приходилось несколько раз дублировать в вершинном буфере одинаковые точки была введена индексация вершин. Теперь геометрия описывается не просто списком вершин, а списком индексов, указывающих на соответствующие вершины. Теперь нет нужды дублировать данные в буфере вершин, достаточно просто использовать определённый индекс повторно.
Использование индексированной геометрии также может значительно ускорить отрисовку геометрии. Происходит это за счёт использования post-TnL кеша. Видеокарта хранит последние преобразованные вертексы, и если следующий индекс указывает на уже преобразованную вершину, то повторного преобразования не происходит (Отметим, что карты АТИ работают с post-TnL кэшем и при неиндексированной геометрией).
Есть два типа индексов:
- 16-ти битные для моделей с количеством уникальных вершин менее 216 (количество примитивов и индексов может быть гораздо большим).
32-х битные для моделей, которым не хватает 16-ти битных индексов. Этот тип ограничен 232 уникальными вершинами, что хватит для любой задачи (В любом случае память видеокарты закончится гораздо раньше). Такие индексы требуют в два раза больше памяти и медленнее, чем 16-ти битные.
В OpenGL отрисовывать индексированную геометрию можно с использованием массивов индексов (в Оперативной памяти, или с помощью VBO). Для этого следует использовать функции:
glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
При рендеринге с VBO параметр indices обозначает сдвиг от начала буфера, при рендере из оперативной памяти - указатель на начало буфера.
Производители рекомендуют использовать glDrawRangeElements.
В DirectX 9 следует обратить внимание на следующие функции:
DrawIndexedPrimitive(D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount)
для рендера с буфером в памяти видеокарты.
DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertices, UINT PrimitiveCount, CONST void * pIndexData, D3DFORMAT IndexDataFormat, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride)
для отрисовки с буфером в оперативной памяти.
Использование второй функции следует избегать, когда количество вершин больше сотни.
Что такое Буфер индексов (Index Buffer)?
5 апреля 2007 (Обновление: 13 июня 2009)