Подтвердить что ты не робот

OpenGL - почему GL_ELEMENT_ARRAY_BUFFER для индексов?

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

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

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

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

4b9b3361

Ответ 1

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 для второго (т.е. в основном квадрат).

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

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

Ответ 2

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

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

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