Eclairage et matériaux Par Xavier Michelon |
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.
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)
|