OpenGL Vertex и буферы

Я занимаюсь разработкой приложения, в котором я читаю из txt-файла пару точек, и мне нужно создать линейный график для отображения точек.

Я использую glDrawElements, с массивом точек и другим массивом индексов. Мне нужно, чтобы отображалось следующее:

  • ось х и у
  • возможность менять цвета оси
  • пара буферов для очков и цветов

Пока что мой подход был следующим:

  • я создал один VBO
  • с двумя объектами массива вершин, один для хранения информации для оси, другой для графа
  • и у меня есть пара буферов, для нескольких строк и соответствующих индексов
  • цвет каждой линии находится в том же буфере, что и точки, например {{XYZW}, {RGBA}}.

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

1 ответ

Решение

Как вы уже заметили, вы должны включить массивы атрибутов с помощью glEnableVertexAttribArray при работе с объектами массива вершин. Несмотря на то, что вы можете связывать разные буферы для каждого атрибута, вы не можете связывать разные атрибуты "для каждого вызова" или аналогичные. Это означает, что все, на что указывает VAO, должно иметь одинаковые атрибуты. Конечно, вы можете игнорировать некоторые атрибуты, данные VAO, но это может привести к неэффективности и, вероятно, не будет хорошей практикой.

Это снова означает, что каждый вызов отрисовки с одинаковой привязкой к VAO использует одинаковые атрибуты. Я думаю, что это лучший способ определить, нужен ли вам новый VAO или нет, сначала определите, нужен ли вам другой набор атрибутов. Затем вы можете легко определить, какую часть объекта рисовать, указав на набор индексов в каком-то другом месте в вашем буфере индекса.

В более объектно-ориентированной сцене (например, в игре, в которой у вас есть четкие сетки), наиболее практичным способом является создание одного или нескольких VAO на сетку. Это позволяет использовать разные типы буферов на сетку (статические, динамические или потоковые). Вы можете даже иметь пару больших буферов (от 1 до 8 МБ на буфер или подобное) и иметь несколько VAO, которые используют один и тот же буфер. Я часто делаю это, чтобы избежать частого выделения памяти.

Я просто дал вам два варианта:

  • Новый VAO для каждого нового набора атрибутов
  • Новый VAO для каждого отдельного объекта в сцене

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

Учитывая вашу проблему, я вижу два варианта. Вы не сказали, будете ли вы часто обновлять вершины или нет. Если вы постоянно изменяете свой график и обновляете свои вершины, я бы дал осям их собственные VAO, так как они никогда не изменятся, поэтому они могут использовать статический буфер, в то время как сам график может использовать динамический или потоковый буфер. Но если оси являются частью всего графа, то есть сам график не будет часто обновляться, вы можете просто выбросить их все в одну VAO для удобства.

Помните, что это всего лишь предложения, вы должны выбрать, что лучше всего подходит для вашей платформы и / или имеет лучшую производительность или просто, что наиболее удобно.

Надеюсь, это немного помогло.

Другие вопросы по тегам