OpenGL - Рендеринг нескольких мешей с отдельными преобразованиями одновременно - PullRequest
1 голос
/ 03 марта 2012

Я ищу способ рендеринга множества мешей одновременно, чтобы мне не нужно было вызывать отрисовку для каждого меша. Я имею дело с 2D-рендерингом, и типичный объект, такой как квадрат, может иметь только два треугольника. Однако объект также может быть довольно сложным и иметь тысячи треугольников.

Теперь каждый объект может перемещаться самостоятельно. Концептуально вполне разумно иметь VBO (или пару VBO / IBO) для каждого «объекта»: пока объект не изменяется, все, что мне нужно, чтобы загрузить в GPU каждый кадр, это информация преобразования: вектор положения и значение ориентации. Или, что эквивалентно, матрица преобразования.

Но проблема с этим подходом заключается в сцене из 1000 квадратных объектов, для инициализации у которых было бы 1000 VBO и 1000 IBO, и 1000 вызовов отрисовки, устанавливающих 1000 наборов униформ в каждом кадре для рендеринга 2000 треугольников.

Хорошо. Если все эти объекты идентичны, я могу иметь один VBO / IBO, чтобы описать их, настроить унифицированный буферный объект (или, возможно, более уместен унифицированный массив - мне все еще нужно научиться использовать их) с данными преобразования для каждый из них, и выполните один вызов отрисовки экземпляра, чтобы вершинный шейдер извлек из UBO данные преобразования, используя номер экземпляра, который он получает. Отлично.

Я просто хочу пойти еще дальше. Я хочу сделать то, что равносильно созданию экземпляров в неидентичных сетках: у меня есть 1000 различных объектов, которые я с удовольствием опишу либо в 1000 отдельных парах буферов вершин / индексов, либо в одной гигантской паре буферов вершин / индексов. Я хочу отправить свои данные преобразования в GPU в один вызов. Это просто вопрос привязки драйвера или графического процессора или выбора вершин.

Можно ли это сделать? Можно ли это сделать без использования геометрических шейдеров SM4?

Обновление: я только что подумал о потенциальном методе для достижения этой цели. Я использую атрибут вершины в качестве значения для "экземпляра", с помощью которого можно проиндексировать UBO, содержащее преобразования. Это способ сделать это?

1 Ответ

0 голосов
/ 03 марта 2012

Вам не нужно одно VBO на объект.Просто объедините все объекты в один VBO или просто небольшой набор VBO.Вы можете обратиться к этому VBO либо добавив смещение к параметру данных функций gl*Pointer, либо используйте glDrawElementsBaseVertex, чтобы добавить смещение по времени рисования.Вместо 4 единиц в массиве индекса объединяются массивы индекса всех маленьких объектов.Если вы используете какой-то стриптиз или фанатский примитив, вы можете установить специальный индекс с glPrimitiveRestartIndex, который при обнаружении запускает новый примитив.

Таким образом, вам нужно разделить вызовы рендеринга только по используемому материалу.настройки и общие преобразования и параметры шейдеров (т. е. текстуры, шейдеры, униформа шейдеров).

...