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

StackOverflow https://stackoverflow.com/questions/487244

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top