Самый правильный ответ - это зависит от того, как вы его запрограммируете, но об этом стоит беспокоиться. Несмотря на то, что графические процессоры стали невероятно быстрыми, пропускная способность к ОЗУ и от нее не является и станет вашим самым неприятным узким местом.
Его данные отправляются в память GPU только один раз и остаются там навсегда?
Надеюсь, да. Для скорости рендеринга вы хотите, чтобы на графическом процессоре было как можно больше данных, вместо того, чтобы повторно отправлять их каждый кадр. VBO служат именно этой цели. Существуют как статические, так и динамические VBO, первый из которых лучше всего подходит для статических моделей, а второй лучше всего подходит для моделей, вершины которых меняются в каждом кадре (скажем, система частиц). Тем не менее, даже когда речь идет о динамических VBO, вы не хотите пересылать все вершины в каждом кадре; только те, которые меняются.
В случае вашего построения, данные вершин просто сидят там, и единственное, что меняется, это ваши матрицы (модель / мир, проекция и вид).
В случае системы частиц я сделал динамический VBO достаточно большим, чтобы хранить максимальное количество частиц, которое когда-либо будет существовать для этой системы. Каждый кадр я посылаю данные для частиц, испускающих этот кадр, вместе с парой униформ, и это все. Когда я рисую, я могу указать начальную и конечную точку в этом VBO, поэтому мне не нужно удалять данные частиц. Я могу просто сказать, не рисуй их.
Когда модель фактически отображается в каждом кадре, должны ли процессоры GPU каждый раз получать свои данные из памяти GPU? Что я имею в виду - если бы у меня было 2 модели, представленные по несколько раз в каждой, - было бы важно, если бы я сначала отображал первую модель несколько раз, а затем - несколько раз, или если я отображал первую только один раз, вторую - только один раз и продолжал чередовать это так?
Отправка нескольких вызовов на ничью вместо одного - намного больший предел. Проверьте рендеринг экземпляров; это могло бы вам очень помочь и сделать ответ на этот вопрос бесполезным. У меня были некоторые проблемы с драйверами, с которыми я еще не работал, но если вы можете заставить его работать, то проблема решена.
Очевидно, что графические карты имеют ограниченный объем ОЗУ - когда он не может содержать все данные модели, необходимые для рендеринга 1 кадра, я думаю, что он продолжает извлекать (частично) из ОЗУ ЦП каждый кадр, верно?
Вы не хотите исчерпать ОЗУ GPU. Если вы это сделаете, то измените вещи, чтобы вы этого не делали. В очень гипотетическом сценарии, который у вас закончится, он, вероятно, каким-то образом рухнет, но я никогда не видел, чтобы это произошло, поэтому, честно говоря, не знаю.
Я забыл сделать одно различие: отправка данных в графический процессор и установка / привязка буферов как текущих. Вызывает ли последний поток данных?
Нет какого-либо значительного потока данных, нет. Это требует определенных затрат, но это верно для каждой строки кода, которую вы пишете. Выяснить, сколько это стоит вам, опять же, для чего нужно профилирование.
создание буфера с инициализацией
Ответ Раксвана звучит хорошо, но не совсем точно. В OpenGL создание буфера не резервирует места. Если вы хотите зарезервировать пространство без передачи каких-либо данных, вы можете вызвать glBufferData и просто передать null. (См. Раздел примечаний здесь .)
обновление данных буфера
Я предполагаю, что вы имеете в виду glBufferData или другие подобные функции, верно? Здесь происходит реальная передача данных. (Если вы не передадите ноль, как я только что сказал в последнем абзаце.)
связывание буфера как активного (это просто способ сообщить API, что я хочу, чтобы этот буфер отображался при следующем вызове отрисовки, и он ничего не делает сам по себе?)
Да, но это может сделать немного больше, чем это. Например, если вы связываете VAO (объект массива вершин), а затем связываете VBO, этот VBO становится связанным с VAO. Позже, если вы снова свяжете этот VAO и вызовете glDrawArrays, он будет знать, что рисовать VBO.
Обратите внимание, что хотя во многих руководствах вы создадите VAO для каждого VBO, мне сказали, что это не их предназначение. Предположительно, вы должны создать один VAO и использовать его с каждым VBO, имеющим такие же атрибуты. Я еще не пробовал, поэтому не могу точно сказать, лучше это или хуже.
Вызов API
То, что здесь происходит, довольно просто (с нашей точки зрения). Скажем, вы связываете VAO, затем вызываете glDrawArrays. Вы указываете начальную точку и счетчик, и он запускает ваш вершинный шейдер для каждой вершины в этом диапазоне, который, в свою очередь, передает свои выходные данные по линии. Однако весь этот процесс - еще одно эссе.