Какова наилучшая практика для объектов пакетного рисования с различными преобразованиями? - программирование
Подтвердить что ты не робот

Какова наилучшая практика для объектов пакетного рисования с различными преобразованиями?

Я концептуализирую хороший подход к рендерингу множества несвязанных фрагментов геометрии с одним призывом рисовать в OpenGL, а стена, против которой я против, - лучший способ сделать это, когда каждая часть имеет другой перевод и, возможно, вращение, так как у вас нет роскоши для обновления вида модели единообразной между одиночными объектами. Я прочитал несколько других вопросов здесь и в других местах, и кажется, что направления, на которые указывают люди, весьма разнообразны. Было бы неплохо перечислить основные методы этого и попытаться изолировать наиболее распространенные или рекомендуемые. Вот идеи, которые я рассмотрел:

[edit: удалено упоминание о Instancing, поскольку оно действительно не применяется здесь]

  • Создание матричных преобразований в шейдере. Здесь я бы послал вектор трансляции или, возможно, угол поворота или кватернион как часть атрибутов. Преимущество заключается в том, что он будет работать на кросс-платформенной платформе, включая мобильный. Но кажется немного расточительным отправлять те же данные преобразования для каждой отдельной вершины в объекте, что и атрибут. Без instancing мне пришлось бы повторять эти идентичные векторы или скаляры для одного объекта много раз в VBO как часть массива чередования, так? Другой недостаток - я полагаюсь на шейдер, чтобы делать математику; Я не знаю, разумно это или нет.

  • Как и в случае с 1), но вместо того, чтобы полагаться на шейдер, чтобы выполнять вычисления матрицы, я вместо этого делаю это на стороне клиента, но все равно отправляю через итоговую матрицу представления модели как поток из 16 поплавков в VBO, Но, насколько я могу судить, без инстинктов мне пришлось бы повторить этот идентичный поток для каждой вершины в VBO, верно? Просто кажется расточительным. Компромисс с 2) выше состоит в том, что я отправляю больше данных в VBO на вершину (16 поплавков, а не 3-плавающий вектор для перевода и, возможно, 4-мерный кватернион), но требуя, чтобы шейдер выполнял меньше работы.

  • Пропустите все вышеуказанные ограничения и вместо этого выполните компромисс с отдельным призывом рисования для каждого объекта. Это то, что обычно "учит" в книгах, которые я читаю, без сомнения, ради простоты.

Существуют ли другие общие методы, чем эти?

Как академический вопрос, мне любопытно, возможно ли все вышеизложенное и "приемлемо", или если один из них явно побеждает над другими? Если бы я был исключительно для использования настольного ГЛ, то он стал основным способом достижения этого?

4b9b3361

Ответ 1

Два соображения:

Вообще говоря, если у вас есть несколько объектов, с каждым объектом используя независимые преобразования, вы используете несколько обратных вызовов. То, что они там. Старая презентация NVIDIA "Batch Batch Batch" цитируется между 10000 и 40 000 обращений за кадром (в D3D. GL) для графического процессора 1 ГГц. В настоящее время вы смотрите скорее на нечто большее. Поэтому, если вы не имеете дело с десятками тысяч отдельных объектов, все они различны (так что никакого инстанса), шансы хороши, что с тобой все будет хорошо.

Другая идея:

Выведите вычисления матрицы модели из шейдера целиком и просто передайте вершины после умножения. Это позволяет использовать один вызов для многих объектов в разных ориентациях и переводах. Стоимость просто приходит на всех вычислениях ЦП, но я полагаю, что если это узкое место не так велико, как узкое место в нескольких вызовах с призывом, это того стоило.

(Взято из здесь.)

Ответ 2

Здесь альтернативная идея:

Дайте каждой вершине идентификатор объекта, который передается через атрибут. Затем в вершинном шейдере используйте этот идентификатор, чтобы выполнить поиск в текстуре, где вы храните матрицы преобразования.