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?

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.


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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.