GLSL несколько шейдерных программ VS переключатели униформы

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


1. Программа шейдера материала

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

Возможные минусы:

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

Плюсы:

  • Код шейдера может быть сгенерирован специально для каждой «опции», используемой в материале.
  • Если я не ошибаюсь, униформу нужно устанавливать только один раз (при создании программы шейдера).
  • 1251] 2. Глобальные шейдерные программы => Создайте одну программу шейдера для каждой функции шейдера (молния, отражение, отображение параллакса ...) и используйте переменные конфигурации для включения или отключения параметров в зависимости от материала для рендеринга.

    Возможные минусы:

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

    Плюсы:

    • Уменьшение количества программ шейдеров.
    • Меньше переключения SP (glUseProgram).


    Вы могли заметить, что мой Текущая тенденция - №1, но я хотел узнать ваше мнение по этому поводу.

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

    Спасибо!

39
задан Profet 30 June 2011 в 19:02
поделиться