Подтвердить что ты не робот

GLSL multiple shaderprogram VS унифицированные переключатели

Я работаю над архитектурой менеджера шейдеров, и у меня есть несколько вопросов для более продвинутых людей. Мой текущий выбор противоречит двум проектам:


1. В программе шейдерного материала

= > Создайте одну шейдерную программу на материал, используемый в программе.

Потенциальные минусы:

  • Учитывая, что каждый объект может иметь свой собственный материал, он включает в себя множество вызовов glUseProgram.
  • Предполагает создание множества объектов shaderprogram.
  • Более сложная архитектура, которая # 2.

Плюсы:

  • Шейдерный код может быть создан специально для каждого "опциона", используемого в материале.
  • Если я не ошибаюсь, униформа должна быть установлена ​​только один раз (при создании шейдерной программы).


2. Глобальные шейдерные программы

= > Создайте одну шейдерную программу для каждой шейдерной функции (молния, отражение, отображение параллакса...) и используйте переменные конфигурации для включения или отбрасывания опций в зависимости от материала для рендеринга.

Потенциальные минусы:

  • Униформа должна меняться много раз за кадр.

Плюсы:

  • Нижние шейдерные программы подсчитываются.
  • Меньше SP swich (glUseProgram).


Возможно, вы заметили, что моя нынешняя тенденция - №1, но я хотел узнать ваше мнение об этом.

  • Устанавливает ли исходная униформа смещение служебных данных вызова glUseProgram (я не особо урод?)
  • В случае №1, для любого соображения памяти или производительности, я должен вызвать glLinkProgram только один раз, когда создаю SP, или я должен отключать/связывать каждый раз, когда вызываю glUseProgram?
  • Есть ли лучшие решения?

Спасибо!

4b9b3361

Ответ 1

Посмотрим на # 1:

Учитывая, что каждый объект может иметь свой собственный материал, он включает в себя много вызовов glUseProgram.

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

Представляет собой создание большого количества объектов shaderprogram.

Это будет больно. В самом деле, главная проблема с №1 - взрывное сочетание шейдеров. Хотя ARB_separate_program_objects поможет, это все равно означает, что вам нужно написать много шейдеров или придумать способ не писать много шейдеров.

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

Итак, я бы сказал, чтобы использовать # 1 с отложенным рендерингом.

Ответ 2

Это зависит от вашего оборудования и конкретных требований вашего приложения.

Еще один аргумент № 2 состоит в том, что ваш шейдер обычно оказывается не таким эффективным, потому что он должен выполнять некоторые условные ветвления на основе формы, в которой вы проходите. Таким образом, вы в основном торгуете между меньшим временем переключения и уменьшенной пропускной способностью в вашем шейдере. Это зависит от того, что хуже.

Вам обязательно нужно только вызвать glLinkProgram один раз за шейдер. Компиляция шейдера занимает гораздо больше времени, чем отключение уже скомпилированных шейдеров.

На самом деле нет лучших решений. Практически все, кто пишет механизм рендеринга, должны принять решение, с которым вы столкнулись.

Ответ 3

На мобильных устройствах ветвление в шейдере значительно увеличивает время рендеринга. Вы должны сделать некоторое измерение на время для переключения программ по сравнению с уменьшенной скоростью дроби, связанной с ветвлением, в каждой операции повторения/на тексель. Я бы рекомендовал метод # 1 и посмотрел, как настроен GPUImage для хорошей дружественной шейдерной архитектуры.

https://github.com/BradLarson/GPUImage