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, чтобы знать, каким образом данные будут рассматриваться, чтобы оптимизировать поток данных соответственно. Но он также хорошо функционирует как мысленное напоминание программисту о том, что в настоящее время рассматривается.