Compartir funciones en varios sombreadores

10

Pregunta simple:

En GLSL, ¿hay alguna manera de compartir funciones entre múltiples sombreadores, o tengo que definir todas las funciones en cada sombreador que las necesite?

TravisG
fuente

Respuestas:

12

Puede definir algunas funciones en un archivo de encabezado e incluirlas en su sombreador. Es un poco diferente de C / C ++ en que pondría los cuerpos de sus funciones en los encabezados, no solo sus prototipos (ya que los sombreadores no tienen un concepto de compilación y enlace separados), sino que es como C / C ++ encabezados

Nathan Reed
fuente
2
Tenga en cuenta al menos que #include en realidad no es compatible con ninguna versión de GLSL hasta 3.30, excepto a través de una extensión que no está disponible universalmente. Sin embargo, cualquier marco de sombreador decente debería extender el lenguaje para proporcionar esta función (incluido Cg).
Sean Middleditch
7

Si #include no está disponible, usaría los argumentos de glShaderSource para especificar las cosas compartidas. Ejemplo:

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
fuente