Eclairage et matériaux
Par Xavier Michelon


 
 
L'algorithme d'éclairage :

Pour des raisons d'efficacité, OpenGL ne calcule pas la couleur de chaque pixel d'un polygone : soit il remplit chaque polygone avec un couleur unie (mode de remplissage 'Flat'), soit il utilise un algorithme de Gouraud (mode 'Smooth'), dont le principe est le suivant : pour un polygone donné, la couleur de chacun des sommets est calculée, et le polygone est rempli avec un dégradé entre ces différentes couleurs.

Pour calculer correctement la réflexion des rayon lumineux en un point, OpenGL a besoin de connaître la perpendiculaire à la surface de l'objet au point considéré. On appelle cette donnée une normale. Nous aurons l'occasion de revenir longuement sur la question des normales dans un prochain didacticiel, et dans le programme exemple, nous utiliserons une théière générée avec ses normales par glut.

 

L'exemple :

Passons maintenant au programme exemple. Aujourd'hui, il affiche à l'écran une théière générée par glut et éclairée par 2 sources lumineuses différentes. Vous avez la possibilité de tourner autour de la théière avec les touches 'a' et 'z', et vous pouvez faire varier certains paramètres d'éclairage avec d'autres touches (jetez un coup d'œil à la fonction de rappel clavier() pour connaître toutes les variables modifiables).

 

Paramètres d'éclairage :

L'architecture du programme est classique et les seules nouveautés concernent l'utilisation du modèle d'illumination. La phase d'initialisation de l'éclairage commence par la spécification du mode remplissage des polygones avec :

glShadeModel(GL_SMOOTH);

Ensuite on indique à OpenGL qu'on souhaite utiliser le calcul d'éclairage, en activant la variable d'état GL_LIGHTING :

glEnable(GL_LIGHTING);

Nous avons vu qu'OpenGL permet d'utiliser jusqu'à huit sources de lumière. Ces huit lampes sont indexées par les constantes GL_LIGHT0 à GL_LIGHT7. Il faut activer chacune des sources qu'on souhaite utiliser (2 dans notre cas) :

glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

Vient ensuite le paramétrage des lampes. Il se fait avec une unique fonction, glLightfv(), dont le prototype est le suivant :

void glLightfv(GLenum lampe,GLenum nomparam, GLType param)

'lampe' désigne la lampe dont on veut modifier un propriété. 'nomparam' est le nom du paramètre à modifier. Il s'agit d'une des dix propriétés de source lumineuse que nous avons évoqué :
- GL_DIFFUSE
- GL_AMBIENT
- GL_SPECULAR
- GL_POSITION
- GL_SPOT_CUTOFF
- GL_SPOT_DIRECTION
- GL_SPOT_EXPONENT
- GL_CONSTANT_ATTENUATION
- GL_LINEAR_ATTENUATION
- GL_QUADRATIC_ATTENUATION

'param' désigne la valeur à affecter au paramètre choisi. Vous remarquerez que les paramètres sont passés sous forme de tableaux.
La définition de la position des sources de lumières se trouve dans la fonction d'affichage. En effet, tout comme les sommets des polygones, les paramètres de position et de direction d'une source subissent les transformations contenues dans la matrice de modélisation-visualisation. Il faut donc placer judicieusement la déclaration de ces deux paramètres. Les deux spots que nous utilisons sont omnidirectionnels (car nous ne modifions pas la valeur par défaut de GL_SPOT_CUTOFF qui vaut 180), et donc le paramètre direction ne nous est pas utile.

 

Paramètres de matériaux :

Le système d'affection des propriétés de matériau utilise le principe de machine à états. OpenGL gère un matériau courant. Lorsqu'un polygone est décrit, il se voit affecter le matériau courant. La modification du matériau courant se fait avec la fonction GlMaterialfv() :

Void glMaterialfv(GLenum face, GLenum nomparam, Gltype param) ;

'face' indique la face (avant ou arrière) dont on souhaite modifier les paramètres. Nous n'avons pas encore abordé les considérations de face, et nous nous satisferons de la valeur GL_FRONT_AND_BACK. Tout comme pour glLightfv(), nomparam désigne la propriété qu'on souhaite changer, et 'param' est un tableau contenant la nouvelle valeur à affecter à 'nomparam'. Les valeur de 'nomparam' possibles sont :
-GL_AMBIENT
-GL_DIFFUSE
-GL_SPECULAR
-GL_EMISSION
-GL_SHININESS (i.e. coefficient de brillance)