Partage des fonctions sur plusieurs shaders

10

Question simple:

Dans GLSL, existe-t-il un moyen de partager des fonctions entre plusieurs shaders, ou dois-je définir toutes les fonctions dans chaque shader qui en a besoin?

TravisG
la source

Réponses:

12

Vous pouvez définir certaines fonctions dans un fichier d'en-tête et #les inclure dans votre shader. C'est un peu différent de C / C ++ en ce que vous mettriez le corps de vos fonctions dans les en-têtes, pas seulement leurs prototypes (car les shaders n'ont pas de concept de compilation et de liaison séparées), mais à part ça, c'est comme C / C ++ en-têtes.

Nathan Reed
la source
2
Notez au moins que #include n'est réellement pris en charge dans aucune version de GLSL jusqu'à 3.30, sauf via une extension qui n'est pas universellement disponible. Tout cadre de shader décent devrait cependant étendre le langage pour fournir cette fonctionnalité (y compris Cg).
Sean Middleditch
7

Si #include n'est pas disponible, vous utiliseriez les arguments de glShaderSource pour spécifier le contenu partagé. Exemple:

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
la source