4 Les bases de OpenGl

Je vais vous exposer les deux fonctions à connaître pour faire de l'affichage :

  • glBegin(TYPE_DU_TRUC_A_AFFICHER) : définit le début d'un bloc OpenGl
  • glEnd() : définit la fin d'un bloc OpenGl

Ensuite le repère :

  • L'axe des abscisses va de -1 à 1
  • L'axe des ordonnées va de -1 à 1
  • L'origine est au centre de la fenêtre
  • Le repère est direct (le point (1,1) est en haut à droite)

On veut faire de l'affichage !!!

On y vient, par exemple si vous voulez afficher un triangle blanc dans votre fenêtre vous écrirez dans la fonction draw() ceci :

1
2
3
4
5
6
7
8
void draw(){
	glBegin(GL_TRIANGLES);
		glColor3ub(255, 255, 255);
		glVertex2d(-0.75, -0.75);
		glVertex2d(-0.0, 0.75);
		glVertex2d(0.75, -0.75);
	glEnd();
}

ATTENTION : une couleur ne se déclare pas toute seule, il faut un vertex pour l'afficher, la dernière couleur utilisé est stockée en mémoire.

Recompilons pour voir :

make
Scanning dependencies of target exBaseOpengl
[100%] Building CXX object CMakeFiles/exBaseOpengl.dir/main.cpp.o
Linking CXX executable exBaseOpengl
[100%] Built target exBaseOpengl

Regardons le résultat :

./exBaseOpengl

plop

Voilà un triangle blanc. C'est un bon début.

Vous avez peut-être remarqué mais je préfère quand même vous le dire, tous les nom des fonctions de OpenGl sont sur le même modèle :

  • D'abord elle commencent toutes par gl ou glu
  • Leur nom peu se décomposer comme suit :
    • gl,nomFonction,nombreDeParamètres,typesDeParamètres

Ainsi glVertex2d :

  • est une fonction OpenGl : gl
  • qui prend deux paramètres : 2
  • ces paramètres sont des double : d

De même glColor3ub :

  • est une fonction OpenGl : gl
  • qui prend trois paramètres : 3
  • qui sont des unsigned bytes (des octets (entre 0 et 255)) : ub

Vous pouvez vous amuser à changer les couleurs des points définis par les glVertex2d :

1
2
3
4
5
6
7
8
9
10
void draw(){
	glBegin(GL_TRIANGLES);
		glColor3ub(0, 0, 255);
		glVertex2d(-0.75, -0.75);
		glColor3ub(0, 255, 0);
		glVertex2d(-0.0, 0.75);
		glColor3ub(255, 0, 0);
		glVertex2d(0.75, -0.75);
	glEnd();
}

Recompilons pour voir :

make
Scanning dependencies of target exBaseOpengl
[100%] Building CXX object CMakeFiles/exBaseOpengl.dir/main.cpp.o
Linking CXX executable exBaseOpengl
[100%] Built target exBaseOpengl

Regardons le résultat :

./exBaseOpengl

Et voilà le résultat :

plop

Et voilà, vous avez un triangle qui a une couleur différente par sommet. Vous pouvez également observer que la limite entre les couleur est progressive (c'est plus joli).

Bien sur vous n'êtes pas condamné à n'utiliser que des triangles :

  • GL_POINTS : chaque vertex sera un point
  • GL_LINES : chaque groupe de 2 vertex sera une ligne (mais si vous mettez 4 vertex le 1 sera relier au 2, le 3 au 4, mais pas le 2 au 3
  • GL_LINE_STRIP : créer une ligne brisée entre les vertex
  • GL_LINE_LOOP : pareil que GL_LINE_STRIP sauf que le premier vertex sera relié au dernier
  • GL_TRIANGLES : chaque groupe de 3 vertex sera un triangle
  • GL_TRIANGLE_STRIP : à chaque nouveau vertex un triangle est formé avec les deux précédents
  • GL_TRIANGLE_FAN : tout les triangles définit on en commun le premier vertex définit
  • GL_QUADS : chaque groupe de 4 vertex sera un carré
  • GL_QUAD_STRIP : à chaque nouveau groupe de 2 vertex un carré est créé avec les deux précédents
  • GL_POLYGON : tout les vertices (vertex au pluriel) forment un polygone convexe

Et comment on fait une sphère ?

Avec la fonction :

1
void gluSphere(GLUquadric* quad, GLdouble radius, GLint slices, GLint stacks);
  • quad : est une structure qui contient tout ce qu'il faut pour faire de l'affichage un peu plus complexe que précédemment
  • radius : rayon de la sphère
  • slices : nombre de lignes en longitude (parallèles), généralement 20
  • stacks : nombre de lignes en latitude (méridiens), généralement 20

Il faut initialiser le GLUquadric* quad :

1
GLUquadric* quad = gluNewQuadric();

Pour résumer :

1
2
3
4
GLUquadric* quad = gluNewQuadric();
glColor3ub(255, 255, 255);
gluSphere(quad, 1.0, 20, 20);
gluDeleteQuadric(quad);

Il faut penser a détruire le GLUquadric*.

Donne une sphère de rayon 1. Mais ça ne marche pas, en tout cas pas tout de suite, on ne fait pas encore de 3D mais ça va venir.

Heu, je suis très pénible et je veut pouvoir changer la taille des points et la largeur des lignes.

Pour cela deux fonctions seront utiles :

  • void glPointSize(GLfloat size); pour changer la taille des points
  • void glLineWidth(GLfloat width); pour changer la largeur des lignes

Si part hasard vous voulez en savoir plus :

Doc sur le site officiel d'OpenGl.