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

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

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

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

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам