Compartilhar funções em vários shaders

10

Questão simples:

No GLSL, existe uma maneira de compartilhar funções em vários shaders, ou eu tenho que definir todas as funções em cada shader que precisar delas?

TravisG
fonte

Respostas:

12

Você pode definir algumas funções em um arquivo de cabeçalho e # incluí-las no seu sombreador. É um pouco diferente do C / C ++, porque você coloca os corpos de suas funções nos cabeçalhos, não apenas nos protótipos (já que os shaders não têm conceito de compilação e vinculação separados), mas, além disso, é como o C / C ++ cabeçalhos.

Nathan Reed
fonte
2
Observe pelo menos que #include não é realmente suportado em nenhuma versão do GLSL até a 3.30, exceto por uma extensão que não está disponível universalmente. Qualquer estrutura de sombreador decente deve estender o idioma para fornecer esse recurso (incluindo Cg).
21812 Sean Sean Middleditch
7

Se #include não estiver disponível, você usaria os argumentos do glShaderSource para especificar o material compartilhado. Exemplo:

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);
Maximus Minimus
fonte