Ответ 1
Прежде всего, вы, вероятно, должны использовать VBO все время. Для небольших и больших объектов.
Затем вторая проблема - "как объединить несколько отдельных объектов в один большой объект?" - чтобы уменьшить количество вызовов OpenGL, которые необходимо выполнить. Как правило, объекты, которые используют одни и те же текстуры (текстуры), параметры материала и шейдеры, могут быть объединены. Например. если у вас есть тонны одинаковых ящиков, вокруг может быть смысл объединить их в несколько более крупных "ящиков".
Если объект представляет собой список треугольников, объединение простое - просто создайте большой список треугольников из исходных списков. Если объект представляет собой треугольную полосу, вам нужно использовать "вырожденные треугольники", чтобы присоединиться к полосам (это очень полезная оптимизация для одного объекта, если он не может быть представлен как одна полоса).
"вырожденный треугольник" представляет собой треугольник с двумя или тремя идентичными индексами вершин. Графическое оборудование может распознавать их и пропускать их очень быстро.
Итак, если у вас есть, например, две полосы с одним треугольником каждый, для всего шести вершин.
Исходными индексами треугольников полос будут:
1) 0, 1, 2
2) 0, 1, 2
Теперь вы соединяете все вершины вместе, поэтому вы получите 6 вершин.
1) 0, 1, 2 (unchanged)
2) 3, 4, 5
Теперь у вас есть один массив вершин, но все же две отдельные полосы. Присоединитесь к ним, вставив вырожденные треугольники:
1) 0, 1, 2, 2, 2, 3, 4, 5
(Я думаю, что это правильно, но на самом деле не подтверждено)
Идея такова: с вышеуказанной полосой графическая карта выводит треугольники из этих вершин:
0, 1, 2
1, 2, 2 <- degenerate! won't be drawn
2, 2, 2 <- degenerate! won't be drawn
2, 2, 3 <- degenerate! won't be drawn
3, 4, 5
В общем случае вам нужно либо вставить два, либо три вырожденных треугольника на основе исходной длины полосы, чтобы треугольная обмотка оставалась правильной.