Bonjour,
Ayant eu un peu de mal avec le titre, je vais essayer de détailler plus clairement mon problème.
Pour commencer, il me semble savoir que les shaders ASM ne s'utilisent pas de la même façon que les shaders GLSL (appels de fonctions différents), déjà là, corrigez-moi immédiatement si j'ai tors, car toute la suite du problème repose là dessus.
Avec les objets de shaders ASM, il est possible de faire :
glBindProgramARB(VERTEX/FRAGMENT, ...);
Et le type du shader a utiliser est specifié explicitement lors du binding.
Avec les fonctions de manipulation des shaders GLSL, il faut regrouper deux shaders dans un program (glAttachShader) puis utiliser ensuite ce program.
L'avantage des shaders ASM (côté API) est que l'on peut changer de fragment program sans avoir à "débinder" le vertex program, comme cela :
(toujours pareil, si j'ai tors dîtes-le moi)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 glBindProgram(GL_VERTEX, a); glBindProgram(GL_FRAGMENT, b); /* utilisation ... */ /* changement du fragment program */ glBindProgram(GL_FRAGMENT, c); /* utilisation ... */
C'est plutôt pratique.
Avec des shaders GLSL, je ne connais aucune méthode pour faire cela aussi "facilement", à part celle-ci :
Et dans ce cas, je me demandais si les appels à glAttach* et glLink* n'étaient pas un peu trop "gourmands" par rapport au simple glBind pour les shaders ASM ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 /* creation */ p = glCreateProgram(); /* 'attachement' */ glAttachShader(p, vs); glAttachShader(p, ps); /* liaison */ glLinkProgram(p); glUseProgram(p); /* utilisation ... */ /* glDetach ps ? ... */ glAttachShader(p, ps2); glLinkProgram(p); glUseProgram(p); /* utilisation ... */
De plus, glLink peut retourner une erreur, et il faut donc prendre en compte la gestion de la valeur de retour.
Merci bien![]()
Partager