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

Буферы индексов в WebGL?

Я пытаюсь изучить некоторые WebGL (из этого урока http://learningwebgl.com/blog/?page_id=1217). Я последовал за гидом, и теперь я пытаюсь реализовать свою собственную демоверсию. Я хочу создать графический объект, содержащий буферы и данные для каждого отдельного объекта, которые будут отображаться в сцене. В настоящее время у меня есть вершинный буфер позиции, буфер координат текстуры и буфер нормалей. В учебнике он использует другой буфер, буфер индекса, но только для кубов. Для чего нужен буфер индекса? Должен ли я реализовать его, и он полезен для чего угодно, кроме кубов?

4b9b3361

Ответ 1

Вершины ваших объектов определяются положением в трехмерной системе координат (эвклидовой системы координат). Таким образом, вы можете взять каждые две следующие вершины и подключить их к строке сразу после того, как ваши 3D-системы координат будут проецироваться на 2D-растровый (экран или какой-либо целевой образ) с помощью процесса растрирования. Вы получите так называемый wireframe.

cube wireframe

Проблема каркаса заключается в том, что он не определен. Если вы посмотрите на куб каркаса под конкретными углами, вы не можете сказать, как куб точно вращается. Это потому, что вам нужно использовать алгоритмы видимости, чтобы определить, какая часть куба ближе к позиции наблюдателей (положение камеры).

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

Итак, у вас теперь есть куб, определяемый треугольниками (так называем треугольную сетку).

cube triangle mesh

Но как определить, какие вершины образуют треугольник? По буферу индекса. Он содержит индекс для буфера вершин (список с вашими вершинами) и сообщает алгоритм растрирования, который три вершины образуют треугольник. Есть много способов, как интерпретировать индексы в индексном буфере, чтобы уменьшить повторение одних и тех же вершин (одна вершина может быть частью множества треугольников), вы можете найти их в о графических примитивах.

Ответ 2

Технически вам не нужен индексный буфер. Существует два способа визуализации геометрии: glDrawArrays и glDrawElements. glDrawArrays не использует индексный буфер. Вы просто записываете вершины один за другим в буферы, а затем рассказываете GL, что делать с элементами. Если вы используете GL_TRIANGLES как режим в вызове, вы должны поместить в буферы тройки данных (вершин, нормалей и т.д.), Поэтому, когда вершина используется несколько раз, вы должны добавить ее mutliple times к буферам.

glDrawElements наоборот можно использовать для хранения вершины один раз, а затем использовать ее несколько раз. Существует один улов, хотя набор параметров для одного индекса фиксирован, поэтому, когда у вас есть вершина, где вам нужны две разные нормали (или другой атрибут, такой как координаты или цвета текстур), вы должны сохранить его для каждого набора свойств.

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

Это зависит от данных, для которых требуется меньше данных, но glDrawElements является более гибким (так как вы всегда можете моделировать glDrawArrays с помощью индексного буфера, который содержит числа 0, 1,2, 3, 4,...).