Génération de terrain (1/2)
Par Xavier Michelon


 
   
Les listes d'affichage

Les listes d’affichage sont une des rares fonctionnalités majeures d’OpenGL que nous n’avons pas encore étudiées. Les listes d’affichage sont des sortes de macros OpenGL, c’est à dire un ensemble prédéfini d’instructions OpenGL qu’on exécute en ‘appelant’ la liste d’affichage. L’utilité la plus évidente des listes d’affichage est l’enregistrement d’objets récurrents. Si vous devez afficher une salle de conférence, il vous suffit d’enregistrer l’objet chaise dans une liste d’affichage que vous appelez autant de fois que vous avez de chaises dans la salle. Les listes d’affichage vous permettent également de stocker des matériaux  et des conditions d’éclairage. Par exemple, vous pouvez créer une liste d’affichage ‘métal’ contenant les instructions de glMatérial() permettant d’obtenir un rendu métallique. Pour définir un objet métallique, il vous suffit d’appeler la liste d’affichage ‘métal’ avant de décrire l’objet en question.

Les liste d’affichage sont conçues de façon à optimiser le temps de rendu, et donc, il est souvent plus efficace d’utiliser une liste d’affichage que de décrire les instructions ‘manuellement’. Le gain dépend de l’implémentation utilisée. L’utilisation d’une liste d’affichage est relativement simple. Comme pour les textures, il faut réserver un identifiant pour une liste d’affichage. On utilise pour cela la fonction

Gluint GlGenLists(GLsizei n);

‘n’ définit le nombre de listes qu’on souhaite créer. La fonction renvoie un bloc de ‘n’ identifiants. Une fois ceci fait, on peut commencer à créer la liste d’affichage avec

void glNewList(Gluint liste,GLenum mode);

‘liste’ doit être un entier retourné par glGenLists(). ‘mode’ peut prendre les valeurs GL_COMPILE et GL_COMPILE_AND_EXECUTE. Si vous utilisez GL_COMPILE_AND_EXECUTE, les instructions que vous entrez dans la liste sont enregistrées et exécutées immédiatement. Si vous utilisez GL_COMPILE, les instructions ne sont pas exécutées lors de l’enregistrement.

Les instructions OpenGL qui suivent l’appel à glNewList() sont mémorisées dans la liste d’affichage jusqu’à l’instruction qui marque la fin de l’enregistrement :

void glEndList();

Pour exécuter une liste d’affichage, il vous suffit d’appeler

void glCallList(Gluint liste);

‘liste’ est bien évidemment l’identifiant de la liste. Il également possible d’effacer une liste d’affichage avec

void glDeleteLists(Gluint liste,GLsizei n);

‘n’ désigne le nombre de liste consécutives à effacer. Il correspond au nombre ‘n’ de listes d’affichage réservées avec glGenLists(). A titre d’exemple, le bout de code ci dessous crée une liste d’affichage contenant un polygone rouge :

int objet;
glGenLists(objet,1);
glNewList(objet,GL_COMPILE);
glColor3f(1.0,0.0,0.0);
glBegin(GL_POLYGON);
glVertex3fv(P1);
glVertex3fv(P2);
glVertex3fv(P3);
glVertex3fv(P4);
glEnd();
glEndList();

Il existe un certain nombre d’instructions OpenGL qui ne sont pas enregistrables dans des listes d’affichage. Vous les trouverez dans ‘la bible d’OpenGL’ (ouvrage [1]). Comme nous ne les avons pas utilisées, je ne les citerai pas ici.