Во-первых, вы, вероятно, должны использовать 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
В общем случае вы должны вставить два или три вырожденных треугольника в зависимости от исходной длины полосы, чтобы обмотка треугольника оставалась правильной.