Bonjour à tous,
J'ai un petit souci pour afficher un cube avec OpenGL/SDL.
Je veux tester le principe du render-to-texture simplement : j'ai une fenêtre SDL qui contient un carré OpenGL dans lequel je veux afficher un cube animé en texture.
Pour l'instant voilà ce que j'arrive à obtenir :
Voici le code que j'utilise pour animer le cube et l'appliquer en texture sur mon carré :
Explications :
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 while (!stopBoolean) { glClearColor(1, 1, 1, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); DrawCube(); glFlush(); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 800, 600); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); DrawSquareWindow(); glPopMatrix(); SDL_GL_SwapBuffers(); SDL_Delay(1); alpha = alpha + 0.1; // Increase the rotation angle }
- DrawCube() dessine le cube que je veux afficher en texture (cette fonction est décrite en dessous).
- DrawSquareWindow() affiche simplement un carré (occupant tout l'espace de la fenetre) et devant prendre en texture le cube dessiné par DrawCube().
- Ma fenêtre est en 800x600.
La fonction DrawCube() :
Note : le carré est toujours coloré avec la dernière couleur utilisée pour le dessin du cube.
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
23
24
25
26
27 void DrawCube() { glPushMatrix(); glRotatef(alpha, 0.3, 0.3, 0); // Draw the cube glBegin(GL_QUADS); glColor3d(1, 0, 0); // Face 1 glVertex3f(0.3, 0.3, -0.4); glVertex3f(0.7, 0.3, -0.4); glVertex3f(0.7, 0.7, -0.4); glVertex3f(0.3, 0.7, -0.4); glColor3d(0, 1, 0); // Face 2 glVertex3f(0.3, 0.3, 0.0); glVertex3f(0.3, 0.3, -0.4); glVertex3f(0.3, 0.7, -0.4); glVertex3f(0.3, 0.7, 0.0); glColor3d(0, 1, 1); // Face 3 glVertex3f(0.7, 0.3, 0.0); glVertex3f(0.7, 0.3, -0.4); glVertex3f(0.7, 0.7, -0.4); glVertex3f(0.7, 0.7, 0.0); glColor3d(1, 1, 0); // Face 4 glVertex3f(0.3, 0.7, 0.0); glVertex3f(0.7, 0.7, 0.0); glVertex3f(0.7, 0.7, -0.4); glVertex3f(0.3, 0.7, -0.4); glColor3d(1, 0, 1); // Face 5 glVertex3f(0.3, 0.3, 0.0); glVertex3f(0.7, 0.3, 0.0); glVertex3f(0.7, 0.3, -0.4); glVertex3f(0.3, 0.3, -0.4); glColor3d(0, 0, 1); // Face 6 glVertex3f(0.3, 0.3, 0.0); glVertex3f(0.7, 0.3, 0.0); glVertex3f(0.7, 0.7, 0.0); glVertex3f(0.3, 0.7, 0.0); glEnd(); glPopMatrix(); }
A part cela j'ai initialisé OpenGL avec le code suivant :
Où...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 glEnable(GL_DEPTH_TEST); // Z-buffer ON glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
Mon but est d'arriver faire en sorte que seul le cube soit coloré (pas le carré entier) et qu'il soit coloré avec les couleurs que j'ai choisies (pas des dégradés de bleu).
Code : Sélectionner tout - Visualiser dans une fenêtre à part static unsigned char texture[3 * 800 * 600];
Egalement : pourquoi les couleurs définies entre les glBegin et glEnd sont-elles utilisées en dehors ?
Merci d'avance pour toute réponse.
Partager