GLSL, все в одній або багатьох програмах шейдерів?


17

Я роблю деякі 3D-демонстрації за допомогою OpenGL, і я помітив, що GLSL дещо "обмежений" (чи це тільки я?). У будь-якому випадку у мене є багато різних видів матеріалів. Деякі матеріали мають навколишнє та дифузне забарвлення, деякі матеріали мають оточуючу карту оклюзії, деякі мають окулярну карту та групу карту тощо.

Чи краще підтримувати все в одній парі шейдерів вершин / фрагментів або краще створити багато шейдерів вершин / фрагментів і вибрати їх на основі обраного на даний момент матеріалу? Яка звичайна стратегія шейдерів у OpenGL або D3D?



Це помилкова дихотомія, що ви повинні вибрати той чи інший підхід до управління шейдерами. За п’ятнадцять років у цій галузі я ніколи не працював над проектом, де ми дотримувались будь-якого екстремуму, але завжди домагався балансу між двома підходами до управління шейдерами, використовуючи кожен, де це було сенс зробити.
Тревор Пауелл

Відповіді:


12

Відповідь - це якось залежить.

В основному є дві школи думки; маленькі, оптимальні шейдери для всього та табір uber-shader.

Маленькі шейдери - це саме те; зробіть одне, і зробіть це добре. Uber-шейдери або контролюють свою функціональність під час виконання уніформи, або збирають у купу різних шейдерів за допомогою макросів препроцесора (та / або генерованих джерел шейдерів).

Оптимальне рішення, мабуть, не те, а якийсь гібрид. Можливо, кілька убер-шейдерів або убер-шейдерів у поєднанні зі спеціалізованими шейдерами для деяких випадків.

Маленький шейдер

Плюси:

  • Ймовірно, буде швидше / оптимальніше
  • Робить просто те, що ви хочете, щоб це зробило
  • Можна легко зробити дивні, спеціальні речі

Мінуси:

  • Легко виходить з рук, особливо коли кількість функцій зростає
  • Напевно, більше роботи, якщо у вас дуже мала кількість шейдерів

Uber-шейдер

Плюси:

  • Все в одному місці
  • Більш приємне для виконавців (використання функції A з функцією X вперше не обов'язково вимагає кодер часу)

Мінуси:

  • Довший час компіляції шейдерів
  • Менше оптимальних результатів (наприклад, якщо для увімкнення / вимкнення функцій використовується уніформа)
  • Може бути складніше налагоджувати / оптимізувати

Uber-shaderу цьому представленні це не дуже добре :) Я б запропонував написати хороший менеджер шейдерів на основі попередніх задач - тому у нас буде код uber-shader з багатьма #ifdefs, який буде змінено для різних матеріалів.
бригадир

2
Я додам, що ще одним фактором убер-шейдера є те, що перемикання шейдерів має вартість з точки зору продуктивності, тому, якщо ви переходите рідше, ви, можливо, зможете підвищити продуктивність.
Jherico
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.