GLSL, все в одной или нескольких шейдерных программах?


17

Я делаю несколько 3D-демонстраций с использованием OpenGL, и я заметил, что GLSL несколько «ограничен» (или это только я?). Во всяком случае, у меня много разных типов материалов. Некоторые материалы имеют рассеянный и рассеянный цвет, некоторые материалы имеют карту окклюзии окружающей среды, другие имеют зеркальную карту, карту рельефа и т. Д.

Лучше ли поддерживать все в одной паре вершинных / фрагментных шейдеров или лучше создавать множество вершинных / фрагментных шейдеров и выбирать их на основе выбранного материала? Какова обычная шейдерная стратегия в OpenGL или D3D?



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

Ответы:


12

Ответ, это вроде как зависит.

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

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

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

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

Плюсы:

  • Вероятно, будет быстрее / более оптимальным
  • Делает только то, что вы хотите сделать
  • Может делать странные, нестандартные вещи легко

Минусы:

  • Легко выходит из-под контроля, особенно когда число функций растет
  • Вероятно, больше работы, если у вас очень мало шейдеров

Uber-шейдер

Плюсы:

  • Все в одном месте
  • Более удобный для художника (использование функции A с функцией X в первый раз не обязательно требует времени программиста)

Минусы:

  • Более длительное время компиляции шейдеров
  • Менее оптимальные результаты (особенно если униформа используется для включения / выключения функций)
  • Может быть сложнее отлаживать / оптимизировать

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

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