Ответ, это вроде как зависит.
В основном есть две школы мысли; маленькие, оптимальные шейдеры для всего и лагеря убер-шейдеров.
Маленькие шейдеры - только это; делай одно, и делай это хорошо. Uber-шейдеры либо управляют своей функциональностью во время выполнения с помощью униформ, либо компилируют в набор различных шейдеров с помощью макросов препроцессора (и / или сгенерированных источников шейдеров).
Оптимальным решением, вероятно, не является ни один, а какой-то гибрид. Возможно, несколько uber-шейдеров или uber-шейдеров в сочетании со специализированными шейдерами для некоторых случаев.
Маленький шейдер
Плюсы:
- Вероятно, будет быстрее / более оптимальным
- Делает только то, что вы хотите сделать
- Может делать странные, нестандартные вещи легко
Минусы:
- Легко выходит из-под контроля, особенно когда число функций растет
- Вероятно, больше работы, если у вас очень мало шейдеров
Uber-шейдер
Плюсы:
- Все в одном месте
- Более удобный для художника (использование функции A с функцией X в первый раз не обязательно требует времени программиста)
Минусы:
- Более длительное время компиляции шейдеров
- Менее оптимальные результаты (особенно если униформа используется для включения / выключения функций)
- Может быть сложнее отлаживать / оптимизировать