Я работаю над архитектурой менеджера шейдеров, и у меня есть несколько вопросов для более продвинутых людей. Мой текущий выбор противоречит двум проектам:
1. В программе шейдерного материала
= > Создайте одну шейдерную программу на материал, используемый в программе.Потенциальные минусы:
- Учитывая, что каждый объект может иметь свой собственный материал, он включает в себя множество вызовов glUseProgram.
- Предполагает создание множества объектов shaderprogram.
- Более сложная архитектура, которая # 2.
Плюсы:
- Шейдерный код может быть создан специально для каждого "опциона", используемого в материале.
- Если я не ошибаюсь, униформа должна быть установлена только один раз (при создании шейдерной программы).
2. Глобальные шейдерные программы
= > Создайте одну шейдерную программу для каждой шейдерной функции (молния, отражение, отображение параллакса...) и используйте переменные конфигурации для включения или отбрасывания опций в зависимости от материала для рендеринга.Потенциальные минусы:
- Униформа должна меняться много раз за кадр.
Плюсы:
- Нижние шейдерные программы подсчитываются.
- Меньше SP swich (glUseProgram).
Возможно, вы заметили, что моя нынешняя тенденция - №1, но я хотел узнать ваше мнение об этом.
- Устанавливает ли исходная униформа смещение служебных данных вызова glUseProgram (я не особо урод?)
- В случае №1, для любого соображения памяти или производительности, я должен вызвать glLinkProgram только один раз, когда создаю SP, или я должен отключать/связывать каждый раз, когда вызываю glUseProgram?
- Есть ли лучшие решения?
Спасибо!