Войти
ПрограммированиеТерминыГрафика

Буфер индексов (Index Buffer)

Буфер индексов (Index Buffer) — буфер, определяющий порядок следования вершин при построении геометрии. Индексный буфер представляет собой массив индексов — «номеров» вершин в вершинном буфере.

Отрисовка с использованием буфера индексов — один из вариантов отрисовки геометрии. В 3д моделях многие вершины принадлежат сразу нескольким треугольникам. Для того чтобы не приходилось несколько раз дублировать в вершинном буфере одинаковые точки была введена индексация вершин. Теперь геометрия описывается не просто списком вершин, а списком индексов, указывающих на соответствующие вершины. Теперь нет нужды дублировать данные в буфере вершин, достаточно просто использовать определённый индекс повторно.

Использование индексированной геометрии также может значительно ускорить отрисовку геометрии. Происходит это за счёт использования post-TnL кеша. Видеокарта хранит последние преобразованные вертексы, и если следующий индекс указывает на уже преобразованную вершину, то повторного преобразования не происходит (Отметим, что карты АТИ работают с post-TnL кэшем и при неиндексированной геометрией).

Есть два типа индексов:

В 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)?

#буферы, #Direct3D, #OpenGL

5 апреля 2007 (Обновление: 13 июня 2009)

Разновидности гранитной плитки granitcapital.ru.