OpenGL VAO: разделяемый экземпляр VBO среди не разделяемых - PullRequest
1 голос
/ 04 мая 2020

У меня разные сетки с разными VBO, у некоторых может быть нормаль, у некоторых нет, и т. Д. c. Каждый я sh также имеет свой VAO со всеми связанными VBO.

Затем я рисую все сетки с помощью экземпляров. Я планирую использовать общий глобальный VBO mat4 для хранения динамически вычисляемых преобразований в каждом кадре. Каждый ВАО также должен указать на этот общий VBO дополнительно. Также количество каждого экземпляра me sh может варьироваться.

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

Разные партии разных экземпляров сеток хотят использовать разные сегменты общего VBO для чтения матриц из. Поэтому мне нужно обновить VAO для каждого кадра.

Вопрос в том, как мне сделать это лучше? И действительно ли такая архитектура хороша? Я полагаю, что я должен использовать glBindVertexBuffer для общего VBO на каждом VAO, поэтому я обновляю смещение и размер сегментов, и VAO упрощаются, но действительно ли это стандартное решение?

1 Ответ

2 голосов
/ 04 мая 2020

Вам не следует беспокоиться об обновлении VAO. На самом деле, вы не должны иметь один VAO на меня sh вообще; иметь один VAO на формат вершин (иначе: материал, установленный glVertexAttribFormat и glEnable/DisableVertexAttrib), и попытаться заставить все ваши сетки использовать один и тот же формат вершин. Установка состояния привязки буфера намного дешевле, чем установка состояния формата вершины.

Таким образом, идея должна заключаться в том, чтобы связать VAO для формата вершины, а затем выполнить итерацию по всем объектам, которые используют этот формат, используя glBindVertexBuffer по мере необходимости для их индивидуальных данных.

...