OpenGL - почему GL_ELEMENT_ARRAY_BUFFER для индексов?
В настоящее время я новичок в области OpenGL ES 2.0 и хотел бы как можно больше понять, что касается привязки, буферов, шейдеров и т.д.
В настоящее время я просто пытаюсь понять различия между GL_ELEMENT_ARRAY_BUFFER
и GL_ARRAY_BUFFER
и когда использовать каждый из отмеченных пресетов.
Мое нынешнее понимание заставляет меня думать, что GL_ELEMENT_ARRAY_BUFFER
специально для индексов для указанных треугольников, а другой - для всего остального.
Может ли кто-нибудь объяснить, почему и если это правильно? Как GL_ELEMENT_ARRAY_BUFFER
обрабатывается по-разному?
Ответы
Ответ 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, чтобы знать, каким образом данные будут решаться, чтобы оптимизировать поток данных соответственно. Но он также хорошо функционирует как умственное напоминание программисту, о чем в настоящее время относится.