Lors de cette scéance, nous abordons le modèle d'illumination d'opengl.
Comme vous avez pu le voir lors du tp sur les textures, nous pouvons en opengl associer à un point
des informations en plus de sa position, comme les coordonnées de texture.
Pour cela il fallait utiliser l'instruction glTexCoord2f(tx,ty) avant de créer le sommet avec glVertex3f(x,y,z).
Pour définir la normale en un sommet c'est le même principe, mais il faut utiliser la fonction glNormal3f(nx,ny,nz).
glTexCoord2f(tx0,ty0); glNormal3f(nx0,ny0,nz0); glVertex3f(x0,y0,z0); glNormal3f(nx1,ny1,nz1); glTexCoord2f(tx1,ty1); glVertex3f(x1,y1,z1); ...
A partir du code du td précédent ( vous pouvez repartir du code fourni ) et des fichiers light.c et light.h :
Le modèle d'illumination d'Opengl est une approximation de la lumière réelle.
Il se décompose en 4 type de lumières:
Pour pouvoir obtenir une illumination, il y a 3 étapes à réaliser :
OpenGL vous donne la possibilité de gérer jusqu'à 8 sources de lumières qui sont activées ou désactivée à l'aide des fonctions :
glEnable(GL_LIGHTX); glDisable(GL_LIGHTX);
X est un chiffre entre 0 et 7 correspondant à la lumière que l'on veut activer. Pour activer le système d'illumination, il faut utiliser :
glEnable(GL_LIGHTING); glDisable(GL_LIGHTING);
Il faut voir l'activation d'une lumière comme l'utilisation d'un interrupteur, et celle du système d'illumination comme un disjoncteur pour l'ensemble des lumières.
La seule fonction à connaître est :
void glLight{if}{v}(GLenum light, GLenum pname, TYPE param)
Cette fonction permet de définir les caractéristique de la source de lumière, comme sa position
(coordonnées homogènes), sa couleur ambiante, diffuse ...
Exemple :
GLfloat lightposition[] = {0.0f,0.0f,2.0f,1.0f}; GLfloat white[4] = {1.0f, 1.0f ,1.0f ,1.0f}; GLfloat black[4] = {0.0f, 0.0f ,0.0f ,1.0f}; ----- glLightfv(GL_LIGHT0, GL_POSITION, lightposition); ----- glLightfv(GL_LIGHT0, GL_AMBIENT, black); glLightfv(GL_LIGHT0, GL_DIFFUSE, white); glLightfv(GL_LIGHT0, GL_SPECULAR, white);
Encore une fois, seule une fonction est à connaître :
void glMaterial{if}{v}(GLenum face, GLenum pname, TYPE param)
Elle permet de spécifier les propriétés matérielles d'un polygone qui seront prisent en compte au moment du calcul de d'éclairage.
Exemple :
GLfloat white[4] = {1.0f, 1.0f ,1.0f ,1.0f}; GLfloat blue[4] = {0.0f, 0.0f ,1.0f ,1.0f}; ----- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE , blue); glMaterialfv(GL_FRONT, GL_SPECULAR, white); glMaterialf(GL_FRONT, GL_SHININESS , 64.0f);
Nous allons maintenant "illuminer" notre spère.
Dans light.h la fonction updateLight(float step) permet de mettre à jour les tableaux lightposition et lightdirection. La position effectue une rotation autour de l'origine et la direction pointe vers l'origine.
OpenGL permet d'appliquer ou non un lissage sur les objets composants une scène à l'aide de la fonction glShadeModel(...).
Ajouter un menu permettant de choisir le type de lissage.
glShadeModel(GL_SMOOTH); ----- glShadeModel(GL_FLAT);