Respostas:
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.
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);