OpenGL-почему буфер массива элементов GL для индексов?

в настоящее время я новичок в OpenGL ES 2.0 realm и хотел бы понять, насколько я могу в отношении привязки, буферов, шейдеров и т. д.

на данный момент я просто пытаюсь понять различия между GL_ELEMENT_ARRAY_BUFFER и GL_ARRAY_BUFFER и когда использовать каждый из отмеченных пресетов.

мое нынешнее понимание заставляет меня верить, что GL_ELEMENT_ARRAY_BUFFER специально для индексов для указанных треугольников, а другой - для всего остального.

кто-то может просьба пояснить, почему и правильно ли это? Как GL_ELEMENT_ARRAY_BUFFER обрабатывается по-разному?

2 ответов


GL_ELEMENT_ARRAY_BUFFER используется для указания буфера, который вы представляете, содержит индексы каждого элемента в "другом" (GL_ARRAY_BUFFER) буфера.

Итак, как очень простой пример только с вершинами (без других данных), если у вас есть буфер индекса:

{0, 1, 2} {0, 2, 3}

и буфер данных содержит:

{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}}

затем, когда вы вызываете glDrawElements, он знает, чтобы выбрать вершины 0, 1 & 2 для первого треугольника, а затем 0, 2, 3 для второго (т. е.: в основном квадрат).

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

Примечание: в приведенном выше примере показаны только вершины - вы можете чередовать столько данных, сколько хотите (цвета вершин, нормали, координаты текстуры... п.)


Это имеет в основном исторические причины. Когда еще не было VBOs, указатели, указанные в glVertexPointer и аналогичные, не были "связаны" с объектом OpenGL любого типа. Когда VBOs были введены, это поведение перенесено в семантику VBOs, которая требовала другой целевой буфер для индексов и атрибутов.

с введением общих атрибутов вершин была добавлена такая функциональность ассоциации.

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