#c #opengl
#c #opengl
Вопрос:
Я создаю средство визуализации на основе плиток, где каждая плитка имеет вершинную модель. Однако из каждой вершинной модели в одном кадре отображается только небольшая часть. Эти подмножества меняются каждый кадр.
Какой был бы самый быстрый способ сделать это? Я могу придумать следующие варианты:
- Сделайте один вызов рисования для каждой модели. Каждая модель полностью хранится на графическом процессоре. Для каждого вызова draw каждый раз переключается полный vbo. Затем индексы используются для выбора подходящей небольшой части для фактического рендеринга.
- Сделайте один вызов draw с одним vbo, который собирается каждый кадр путем копирования необходимого (небольшого) подмножества всех других vbo (данные копируются в видеопамять).
- Сделайте один вызов draw с одним vbo, но vbo воссоздается каждый кадр с (небольшим) подмножеством из данных ЦП с использованием glBufferData.
Как вы думаете, что быстрее, или вы можете придумать что-нибудь быстрее?
Очевидно, что одним из решающих факторов является то, что переключение между большими VBO обходится дороже, чем переключение между меньшими VBO.
Ответ №1:
Делать много вызовов с выводом — плохая идея. В OpenGL этот метод будет привязан к процессору, поэтому лучше использовать много моделей.
На самом деле, я бы выбрал этот метод. Вся статическая геометрия находится внутри одного и только одного VBO и одного VAO. Это не означает, что у вас есть только «один вызов рисования». Однако вам следует использовать glMultiDraw * Indirect . Идея заключается в том, что вы должны использовать вычислительные шейдеры для выполнения отбраковки на GPU и использовать что-то вроде расширений GL_INDIRECT_PARAMETERS с вашим множественным косвенным вызовом draw. Косвенный рисунок
Для всей динамической геометрии вы можете использовать постоянный буфер.
Чтобы ответить на ваш вопрос об изменении vao / vbo. Изменение VAO или использование glBindVertexBuffer не должно приводить к большим накладным расходам.
Но вы должны его профилировать, это может зависеть от вашего драйвера / оборудования 🙂