Les spots pour OpenGL sous Windows

 

 

 

Introduction

Pour comprendre ce chapitre, il est indispensable d'avoir lu le chapitre sur les couleurs et les lumières.

En effet, un spot est une lumière omnidirectionnelle. Il faudra donc allumer la lampe, gérer son éclairage... de la même manière.

Il y a bien sûr des informations supplémentaires par exemple, pour un spot, il faut spécifier un angle qui définit son cône de lumière (Cet angle se nomme cutoff) ainsi que d'autres paramètres.

 

cutoff

Un spot a donc besoin d'un angle (cutoff) qui définit son cône de lumière.

Le cutoff peut être compris entre 0° et 90°. Une valeur particulière est admise: le 180°

Pour paramétrer le cutoff, il suffit d'utiliser la fonction glLight (déjà vu !)

void glLightf(
GLenum light,
GLenum pname,
GLfloat param
);

ou


void glLighti(
GLenum light,
GLenum pname,
GLint param
);

Avec light étant toujours la source de lumière...

pname à GL_SPOT_CUTOFF

param étant la valeur de l'angle cutoff à passer.

En sortie:

GL_INVALID_ENUM si light est une lumière inexistante.

GL_INVALID_OPERATION si vous utilisez la fonction entre glBegin et glEnd.

GL_INVALID_VALUE si la valeur à utiliser pour l'angle est incorrecte.

 

Couleurs des objets

Jusqu'à présent, vous avez vu les couleurs ambiantes et diffuses. Vous allez maintenant voir les couleurs spéculaires.

En effet, vos objets seront soumis à des lumières directes. Vous pourrez alors indiquer les composantes RVBA restituées par votre objet.

Jusqu'à présent, nous avions vu glColorMaterial() et glColor() pour définir les composantes RVBA dans les différents types de définition de couleurs (GL_EMISSION, GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, et GL_AMBIENT_AND_DIFFUSE).

L'avantage, si un objet avait différentes couleurs par faces, après avoir défini le type de couleur à modifier, il ne restait plus qu'à passer les composantes RVBA correspondantes sans avoir à rappeler sans arrêt le type.

Mais si votre objet ne change pas de couleur, on peut aussi utiliser une fonction combinant un glColorMaterial() et un glColor(): Il s'agit de la fonction glMaterial()

void glMaterialfv(
GLenum face,
GLenum pname,
const GLfloat *params
);
void glMaterialiv(
GLenum face,
GLenum pname,
const GLint *params
);

Avec face pouvant prendre les valeurs GL_FRONT, GL_BACKou GL_FRONT_AND_BACK pour spécifier la face à mettre à jour.

pname prenant GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION ou GL_AMBIENT_AND_DIFFUSE

et enfin param qui est un tableau sur les composantes de la couleur.

 

Direction du spot

Vous avez positionné votre lampe, mais ici, vous utilisez un spot, il faudra donc en plus indiquer la direction de l'éclairage. Vous utiliserez une vieille connaissance pour cela : glLight() et plus exactement glLightfv ou glLightiv. Les paramètres seront GL_SPOT_DIRECTION suivi d'un pointeur sur un tableau contenant les coordonnées d'un vecteur. Par défaut, les coordonnées sont à (0,0,-1). Evidemment, si vous l'oubliez, le rendu risque de ne pas être très réaliste !

 

Qualité d'affichage de la lumière du spot projetée sur les faces

Lorsqu'un spot éclaire une surface, un cercle éclairé apparait sur cette surface, à l'extérieur de ce cercle, les couleurs s'assombrissent. Il est possible de paramétrer la qualité d'affichage de tout ceci. Vous utiliserez pour cela une fonction déjà largement vue: glLight(), plus exactement glLightf ou glLighti avec comme paramètre GL_SPOT_EXPONENT suivi d'une valeur variant de 0 (mauvaise qualité, la couleur est uniforme) à 128 (Très bonne qualité et donc plus lent !).

 

Exemple

Image non trouvée !

Nous reprenons le principe du cube, mais là, il sera composé de barres.

Image non trouvée !Cela semble rendre pas trop mal...

Pourtant, sur le coté, c'est moins bien:

Image non trouvée !L'ennui, c'est qu'il n'y a que 4 vertice par rectangle pour calculer la tâche de lumière. Dans ce cas, le rendu est moins bien...(ici, le rendu n'est pas bien fait sur l'axe des x il n'y a qu'un objet, alors qu'il reste correct en Y puisqu'il y a 17 objets sur cet axe). Il ne faut pas oublier que les calcules sont fait à partir des vertice.

De plus, ces vertice ne se trouveront pas forcement dans la lumière du spot. Une vue de face du cube pourrait alors faire apparaître ceci:

Image non trouvée !Il semble ne plus y avoir de spot ! En fait, la tâche de lumière est au milieu de notre face, le problème, c'est qu'il n'y a pas de vertice à cet endroit ! L'effet du spot n'est alors plus visible que lorsque la lumière atteint les arêtes de notre cube, là où se trouve nos vertice...(l'image précédente !)

En résumé, plus il y aura de vertice, mieux le rendu sera, mais plus long sera aussi le traitement !

Vous comprenez aussi pourquoi je n'ai pas travaillé ici avec notre petit cube du chapitre précédent !

 

Essayez de modifier des paramètres comme la qualité du rendu du spot de lumière sur l'objet et voyez le résultat...

 

Annexes

OpenGL pour Linux, Windows, Android...