Я вижу, что OpenGL версии 3 и выше исключают использование рендеринга на стороне клиента. Немедленный режим был исключен, и массивы вершин, похоже, устарели. Вместо этого, если я правильно понимаю, VBO являются основным способом рендеринга вершин.
Хотя я вижу логику в том, чтобы иметь единый способ рендеринга всего, разве в том случае, если у VBO нет больших недостатков по сравнению с массивами вершин? Я думал, что VBO должны быть большими буферами, содержащими> 1 МБ данных, как правило. Что если у меня есть сцена, которая имеет меньшую геометрию? У меня есть граф сцены с большим количеством узлов, каждый из которых нуждается в своем собственном преобразовании и т. Д. Каждый узел также должен иметь возможность удалять отдельно, добавляться отдельно и т. Д. Я использовал массивы вершин раньше. Итак, мой первый вопрос заключается в том, будет ли, если я переключусь на VBO, увеличивать издержки на мои объекты графа сцены сейчас, потому что VBO необходимо выделить для каждого объекта.
Другая проблема заключается в том, что рендеринг геометрии может быть очень динамичным. В худшем случае могут быть моменты, когда всю геометрию необходимо повторно отправлять каждый кадр в течение некоторого периода времени. В этом случае производительность VBO будет хуже, чем у вершинных массивов, или в худшем случае VBO будет выполнять столько же работы, сколько и у вершинных массивов, но не больше?
Итак, в более кратком формате, мои вопросы:
1) Существуют ли существенные накладные расходы на распределение / освобождение VBO (я имею в виду простой акт настройки буфера)?
2) Если я обновляю данные из CPU каждый кадр, может ли это быть значительно хуже, чем если бы я использовал массивы вершин?
И, наконец, я хотел бы знать:
3) Если ответ на любой из приведенных выше вопросов «да», зачем отказываться от других режимов рендеринга, которые могут иметь преимущества перед VBO? Есть ли что-то, чего я здесь упускаю, например, методы, которые я должен использовать, чтобы смягчить некоторые из этих потенциальных затрат на распределение и т. Д.?
4) Существенно ли меняются ответы на эти вопросы в зависимости от того, какую версию OpenGL я использую? Если я сделаю рефакторинг своего кода, чтобы он был совместим с OpenGL 3 или 4, используя VBO таким образом, чтобы он был эффективным, будут ли те же самые методы работать хорошо с OpenGL 2, или вероятно, что некоторые методы будут намного быстрее с OpenGL 3 + и другие с OpenGL 2?
Я задал этот вопрос о переполнении стека, но я пересылаю сюда, потому что я понял, что этот сайт может быть более подходящим для моего вопроса.