2013-04-30 2 views
3

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

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

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

До сих пор, мой подход был следующим :

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

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

ответ

1

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

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

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

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

  • Нового ВАО для каждого нового набора атрибутов
  • Нового Вао для каждого отдельного объекта в сцене

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

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

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

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

Смежные вопросы