Я делаю несколько 3D-демонстраций с использованием OpenGL, и я заметил, что GLSL несколько «ограничен» (или это только я?). Во всяком случае, у меня много разных типов материалов. Некоторые материалы имеют рассеянный и рассеянный цвет, некоторые материалы имеют карту окклюзии окружающей среды, другие имеют зеркальную карту, карту рельефа и т. Д.
Лучше ли поддерживать все в одной паре вершинных / фрагментных шейдеров или лучше создавать множество вершинных / фрагментных шейдеров и выбирать их на основе выбранного материала? Какова обычная шейдерная стратегия в OpenGL или D3D?
Ответы:
Ответ, это вроде как зависит.
В основном есть две школы мысли; маленькие, оптимальные шейдеры для всего и лагеря убер-шейдеров.
Маленькие шейдеры - только это; делай одно, и делай это хорошо. Uber-шейдеры либо управляют своей функциональностью во время выполнения с помощью униформ, либо компилируют в набор различных шейдеров с помощью макросов препроцессора (и / или сгенерированных источников шейдеров).
Оптимальным решением, вероятно, не является ни один, а какой-то гибрид. Возможно, несколько uber-шейдеров или uber-шейдеров в сочетании со специализированными шейдерами для некоторых случаев.
Маленький шейдер
Плюсы:
Минусы:
Uber-шейдер
Плюсы:
Минусы:
источник
Uber-shader
в этом представлении не очень хорошая вещь :) Я бы предложил написать хороший менеджер шейдеров на основе предопределений - так что у нас будет код uber-shader со многими#ifdef
s, которые будут переключаться для различных материалов.