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