Совместное использование функций несколькими шейдерами

10

Простой вопрос:

В GLSL есть ли способ разделять функции между несколькими шейдерами, или мне нужно определить все функции в каждом шейдере, который нуждается в них?

TravisG
источник

Ответы:

12

Вы можете определить некоторые функции в заголовочном файле и включить их в свой шейдер. Он немного отличается от C / C ++ в том, что вы помещаете тела своих функций в заголовки, а не только их прототипы (поскольку у шейдеров нет концепции раздельной компиляции и компоновки), но в остальном это похоже на C / C ++. заголовки.

Натан Рид
источник
2
Обратите внимание, по крайней мере, что #include фактически не поддерживается ни в одной версии GLSL до 3.30, кроме как через расширение, которое не является универсально доступным. Любая приличная структура шейдеров должна расширять язык, чтобы обеспечить эту функцию (включая Cg).
Шон Миддлдич
7

Если #include недоступно, вы можете использовать аргументы glShaderSource для указания общего содержимого. Пример:

char *sharedcode = "...shared code here...";
char *fs1 = "...fragment shader 1...";
char *fs2 = "...fragment shader 2...";

char *awesomeeffect1[] = {sharedcode, fs1};
char *awesomeeffect2[] = {sharedcode, fs2};

glShaderSource (shader1, 2, awesomeeffect1, NULL);
glShaderSource (shader2, 2, awesomeeffect2, NULL);
Максимус Минимус
источник