OpenGL: эффективный способ рендеринга партии геометрии?

Это то, что я искал в то время, но я еще не нашел никакой конкретной информации или хороших примеров. У меня, скажем, куча несвязанных объектов (например, треугольных полос). Каков эффективный способ их рендеринга?

Я слышал о том, чтобы поместить несколько объектов в один VBO, чтобы уменьшить вызовы openGL, но не видел надлежащего примера того, как это сделать. Я также видел сообщения, которые противоречат этой идее. Так что прямо сейчас я в основном смущен.

Ответ 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

В общем случае вам нужно либо вставить два, либо три вырожденных треугольника на основе исходной длины полосы, чтобы треугольная обмотка оставалась правильной.

Ответ 2

Посмотрите glDrawElements(), это один из лучших способов добиться того, чего вы хотите. Обратите внимание, что производительность может снизиться, если ваши данные изменят каждый кадр, поскольку вам необходимо обновить соответствующие части данных, что означает их копирование в память графической карты. Для статических данных это очень быстро.