Placage de texture (2/2)
Par Xavier Michelon


 
 
Eclairage des textures

L’éclairage des textures se fait de la même manière que pour les objets non texturés, nous y avons déjà consacré un didacticiel. La seule différence est que l’utilisation de textures a pour effet d’atténuer fortement l’éclairage spéculaire (les tâches lumineuses donnant un aspect brillant aux objets). Pour remédier à ce problème, OpenGL permet de séparer le calcul de l’éclairage spéculaire grâce à l’appel suivant :

glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);

Pour désactiver cette fonctionnalité, remplacez GL_SEPARATE_SPECULAR_COLOR par GL_SINGLE_COLOR. Dans le programme exemple, la touche ‘s’ permet de basculer entre ces deux modes de calcul de l’éclairage.

Brouillard

Il est relativement facile de créer un effet de brouillard avec OpenGL. En effet, le rendu utilise la notion de profondeur (distance d’un objet à l’observateur) pour le rendu. En ‘mixant’ la couleur d’un objet avec une couleur ‘du brouillard’ en fonction de la distance (plus l’objet est éloigné, plus la couleur de fond est prépondérante), on crée un joli brouillard.

L’activation et la désactivation du brouillard se fait respectivement avec glEnable(GL_FOG) et glDisable(GL_FOG). La modification des paramètres du brouillard se fait avec la fonction

glFogf(GLenum nomparam,Glfloat valeur)

‘paramètre’ est le nom du paramètre à modifier, et ‘valeur’ est évidemment la nouvelle valeur du paramètre. Il existe plusieurs modes de brouillard, correspondant à différentes fonctions de mélange de la couleur de l’objet et de la couleur du brouillard. Je ne vais pas détailler tous les modes aujourd’hui (vous trouverez tout ça dans le livre [1]), je vous livre simplement les paramètres utilisés pour le programme exemple. Il s’agit d’un brouillard de type exponentiel :

glFogi(GL_FOG_MODE,GL_EXP); /* Réglage du type de brouillard */
glFogfv(GL_FOG_COLOR,couleurAP); /* Couleur du brouillard, généralement la identique à la couleur de fond définie avec glClearColor()*/ 
glFogf(GL_FOG_START,0); /* distance de début du brouillard (relativement à l’observateur) */
glFogf(GL_FOG_END,15); /* distance de fin du brouillard */
glFogf(GL_FOG_DENSITY,0.35); /* Densité du brouillard */