Lumières et matériaux - TD n°4

Lors de cette scéance, nous abordons le modèle d'illumination d'opengl.

Exercice 1 : Les normales

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 :

  1. Modifier les fichier main pour afficher une sphère (code fourni dans light.h) à la place du demi-cube.
  2. Dans la fonction drawSphere, ajouter une normale pour chaque sommet.
  3. Trouvez deux méthodes permettant de normaliser ces normales.
  4. Quelle est la plus appropriée ? Pourquoi ?

Petit cours - Le modèle d'illumination opengl

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:

  • Ambiante : lumière qui a été réfléchie plusieurs fois avant d'atteindre l'objet sur toute sa surface.
  • Diffuse : lumière atteignant directement l'objet, dont l'intensité est calculée en fonction de la normale à la surface.
  • Spéculaire : réflexion de la lumière en un point précis de la surface. Son intensité est dépendante du point de vue.
  • Émissive : simulte la caractéristique émissive d'un objet.

Pour pouvoir obtenir une illumination, il y a 3 étapes à réaliser :

  1. Activer les lumières
  2. Configurer les lumières
  3. Choisir les matériaux des objets

I) Activation d'une lumière

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.

II) Caractéristique d'une source de lumière

La seule fonction à connaître est :
void glLight{if}{v}(GLenum light, GLenum pname, TYPE param)

  • light : la source de lumière GL_LIGHT[0-7]
  • pname : le paramètre à configurer
  • param : la valeur à associer au paramètre choisi

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);

III) Propriétés matérielles des objets

Encore une fois, seule une fonction est à connaître :
void glMaterial{if}{v}(GLenum face, GLenum pname, TYPE param)

  • face : la face sur laquelle s'applique le matériel
  • pname : le paramètre à configurer
  • param : la valeur à associer au paramètre choisi

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);

Exercice 2 - Que la lumière soit ! (ou pas)

Nous allons maintenant "illuminer" notre spère.

sphere sphere2

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.

  1. Créez une source de lumière ponctuelle qui effectue une rotation autour de la sphère au niveau de son équateur. Utilisez pour cela la fonction citez plus haut et la fonction idleFunc.
    Il y aura un reflet spéculaire sur la sphère dont l'exposant sera 64.

  2. Ajouter un menu permettant de changer la couleur de la sphère.

  3. Ajouter un sol discrètisé (plusieurs carrés et non pas un gros).

  4. Ajouter un menu permettant de changer votre source de lumière.
    Pour cela vous allez créer 3 sources et activer celle qui vous intéresse :
    1. Source ponctuelle
    2. Source directionelle
    3. Source spot

Exercice 3 - Le lissage

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);

 

nstanceEnd -->