Bonsoir,
Peut on appliquer plusieurs shaders à un objet ?
Je m'explique, si je crée par exemple une primitive 2D( un carré ), peut-on faire ceci:
1°)Créer , compiler et exécuter le vertex shader a part(donc on aura seulement le vertex shader linké avec le programm (glCreateProgram()).
2°) Créer, compiler et exécuter le fragment shader a part, et donc le linké avec un autre programme différent du premier.
de façon a obtenir un truc comme ça:
Le problème c'est que j'ai une classe Window qui gére les matrices de modelview et de projection et j'applique dans cette classe un shader pour tout objet qui sera dessiné car je dois envoyer les matrices a mon shader.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 -glUseProgramm(programm1); -glUseProgramm(programm2); -Dessin de la primitive glUseProgramm(0);
nb:ici le carré est dessiné.
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 Primitive2D carre; while (event.quit()) { event.update(); window.beginDraw(bgcolor); /* la classe Window gére une pile de matrice*/ carre.draw(); window.endDraw(); }
Voici les fonctions membre beginDraw() et endDraw():
Maintenant pour le cas du fragment shader j'aimerai faire ceci:
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
22 void WindowHandler::beginDraw(const core::Colorf& color) { _bgcolor.setColor(color); glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glClearColor(_bgcolor.getRed(),_bgcolor.getGreen(),_bgcolor.getBlue(),_bgcolor.getAlpha()); _pMatrixStack.push();/* matrice de projection */ /* je fais référence ici a mon exemple du carre, donc ceci et le premier shader(vertex), j'envoi juste mes matrices pour calculer la position de chaque vertex*/ _shaderHandler.use(true); _shaderHandler.sendMatrix("mvMatrix",_mvMatrixStack.getCurrentMatrix()); _shaderHandler.sendMatrix("pMatrix",_pMatrixStack.getCurrentMatrix()); } void WindowHandler::endDraw(void) { _shaderHandler.use(false);/* equivalent à glUseProgramm(0);*/ this->popProjectionMatrix(); glFlush(); SDL_GL_SwapBuffers(); }
nb: ici le carré n'est plus visible
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
22 Primitive2D carre; Shader f; f.setType(EST_FRAGMENT); f.loadFile("Shaders/defaultFragmentShader_flat.txt"); p.setShaders(NULL,&f); p.compile(); /* compilation et création du programm*/ p.bindAttribute(EAA_COLOR,"ex_Color"); p.execute(); /* linker le programm */ while (event.quit()) { event.update(); window.beginDraw(bgcolor); p.use(true); /* ici ça foire si j'applique le fragment shader */ carre.draw(); p.use(false); window.endDraw(); }.
voici les shaders utilisés:
-Shader par defaut utilisé par la classe Window
-Fragment shader pour la couleur du carré
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #version 330 in vec2 in_Position; uniform mat4 mvMatrix; uniform mat4 pMatrix; void main(void) { gl_Position = mvMatrix * pMatrix * vec4(in_Position, 0.0, 1.0); }
j'espere que je suis assez clair.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #version 330 in vec4 ex_Color; out vec4 fragColor; void main(void) { fragColor = ex_Color; }
Voila Merci d'avance.
EDIT:
Je fais ceci juste pour ne pas créer 2 shaders par primitive, imaginez que dans mon programme il y a des 10aines de primitives(2*10) 20 shader quand même...
Si vous avez des techniques je suis preneur, merci encore.
Partager