Я столкнулся с проблемой, которая, по моему мнению, зависит от VAO, но я не уверен ..
Я не уверен в правильном использовании VAO, то, что я делал во время инициализации GL, было простым
glGenVertexArrays(1,&vao)
за которым следует
glBindVertexArray(vao)
а позже, в моем конвейере рисования, я просто вызвал glBindBuffer (), glVertexAttribPointer (), glEnableVertexAttribArray () и т. д., не заботясь о изначально привязанном VAO
это правильная практика?
Ответы:
VAO действуют аналогично VBO и текстурам в отношении того, как они связаны. Наличие одной привязки VAO для всей длины вашей программы не принесет никакого выигрыша в производительности, потому что вы можете вообще просто выполнять рендеринг без VAO. Фактически, это может быть медленнее в зависимости от того, как реализация перехватывает настройки атрибутов вершин во время их рисования.
Смысл VAO состоит в том, чтобы запустить все методы, необходимые для рисования объекта один раз во время инициализации, и исключить все дополнительные накладные расходы на вызов методов во время основного цикла. Дело в том, чтобы иметь несколько VAO и переключаться между ними при рисовании.
С точки зрения передовой практики, вот как вам следует организовать свой код:
Это позволяет избежать беспорядка, связанного с связыванием / отвязкой буферов и передачей всех настроек для каждого атрибута вершины, и заменяет его одним вызовом метода, связывающим VAO.
источник
Нет, это не то, как вы используете VAO. Вы должны использовать VAO так же, как вы используете VBO, текстуры или шейдеры. Сначала настройте его. А во время рендеринга только их привязывайте, не изменяя.
Итак, с VAO вы делаете следующее:
void Setup() { glGenVertexArrays(..); glBindVertexArray(..); // now setup all your VertexAttribPointers that will be bound to this VAO glBindBuffer(..); glVertexAttribPointer(..); glEnableVertexAttribArray(..); } void Render() { glBindVertexArray(vao); // that's it, now call one of glDraw... functions // no need to set up vertex attrib pointers and buffers! glDrawXYZ(..) }
См. Также эти ссылки:
источник
glEnableVertexAttribArray(...)
следует называть раньшеglVertexAttribPointer(...)
. Некоторые водители (включая меня) на самом деле не нравится, наоборот.Да, это совершенно законно и действительно. Это хорошо? Хорошо...
По этому поводу проводилось неформальное тестирование производительности . И кажется, по крайней мере, на оборудовании NVIDIA, где это тестировалось, «правильное» использование VAO (то есть то, что отстаивали все остальные) на самом деле происходит медленнее. во многих случаях . Это особенно верно, если изменение VAO не влияет на то, какие буферы связаны.
Насколько мне известно, подобное тестирование производительности на оборудовании AMD не проводилось. В общем, если с ними что-то не изменится, это приемлемое использование VAO.
источник
Ответ Роберта выше работал у меня, когда я его пробовал. Для чего здесь стоит код на Go использования нескольких объектов атрибутов вершин:
// VAO 1
Затем в основном цикле вы можете использовать их как таковые:
Если вы хотите увидеть полный исходный код, он доступен в виде Gist на основе примеров в go-gl:
https://gist.github.com/mdmarek/0f73890ae2547cdba3a7
Спасибо всем за оригинальные ответы, у меня был тот же вопрос, что и у ECrownofFire.
источник