OpenGL: эффективный способ визуализации пакета геометрии? - PullRequest
12 голосов
/ 28 января 2009

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

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

Ответы [ 2 ]

16 голосов
/ 28 января 2009

Во-первых, вы, вероятно, должны использовать 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

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

1 голос
/ 28 января 2009

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

...