Display list ou liste d'affichage sous OpenGL pour Linux

 

 

Jusqu'à présent, dans nos cas (très simple) , nous avons eu à lancer de 2 classeurs (dans les exemples de transformations ou de restauration de l'état de la matrice).

Dans le code, j'ai donc été obligé de dupliquer la partie dessin du classeur.

Mais, bien évidemment, sinon, je ne vois pas l'intérêt dans parler, nous aurions pu nous éviter cela !

OpenGL propose les display list. Ces display list vont permettre de regrouper des commandes OpenGL et de pouvoir les réutiliser de manière répétées.

Les avantages seront alors les suivants:

- Légère accélération du code, les commandes placées dans les display list sont comme compilées par OpenGL, une étape qui ne sera alors plus à refaire ensuite.

- Simplicité de lecture et de maintenance du code (Pas de répétition de celui).

 

Génération de display list

Vous utiliserez la fonction glGenLists

GLuint glGenLists(
GLsizei range
);

range étant le nombre de display list à générer. Cette fonction retournera la valeur n de la première display list. Vous pourrez ensuite accéder aux autres display list qui seront numérotées de n à n + range - 1.

Evidemment, il est préférable de mettre une valeur range > 0, sinon, si range = 0, rien ne sera généré !

Cette fonction retourne:

GL_INVALID_VALUE si la valeur de range est négative.

GL_INVALID_OPERATION si appelée entre glBegin et glEnd.

Vous pourrez y mettre les fonctions openGL standard que vous voulez, tout en sachant que certaines de ces fonctions ne pourront pas être compilées...

 

Existence d'une display list

Il est possible de vérifier l'existence d'une display list via la fonction gllsList.

GLboolean glIsList(
GLuint list
);

list étant la valeur de la display list à tester. En sortie, la fonction retourne TRUE si la display list existe, FALSE sinon.

GL_INVALID_OPERATION est retourné si la fonction est appelée entre glBegin et glEnd.

 

Effacer une ou plusieurs display list

void glDeleteLists(
GLuint list,
GLsizei range
);

list étant la valeur de la première display list à effacer.

range étant le nombre de display list à effacer.

Cette fonction retourne:

GL_INVALID_VALUE si la valeur de range est négative

GL_INVALID_OPERATION si appelée entre glBegin et glEnd.

 

Renseigner la display list

Vous avez jusqu'ici créé des display list, mais il n'y a rien dedans. Il faut donc maintenant leur affecter les commandes qui vous intéressent:

Il faudra tout d'abord indiquer que vous commençez à renseigner une display list en utilisant la fonction

void glNewList(
GLuint list,
GLenum mode
);

avec list étant le numéro de la display list à renseigner,

mode pouvant prendre la valeur GL_COMPILE, dans ce cas, vous préparez la display list, mais vous ne faîtes rien d'autre.

ou mode positionné à GL_COMPILE_AND_EXECUT, dans ce cas vous préparez la display list, mais vous exécutez aussi son contenu immédiatement.

 

Puis indiquer que vous en avez terminé avec elle via

void glEndList(
void
);

 

Exécuter le contenu d'une display list

Exécuter une display list:

void glCallList(
GLuint list
);

Avec list qui est le numéro de la display list à exécuter.

Exécuter une série de display list:

void glCallLists(
GLsizei n,
GLenum type,
const GLvoid *lists
);

n est le nombre de display list à exécuter

type Définit le type d'un tableau dans lequel vous trouverez la liste des display list à lancer. type pouvant prendre les valeurs suivantes:

Nom Informations
GL_BYTE Valeur signée sur 1 octet (-128 à 127)
GL_UNSIGNED_BYTE Valeur non signée sur 1 octet (0 à 255)
GL_SHORT Valeur signée sur 2 octets (-32768 à 32767)
GL_UNSIGNED_SHORT Valeur non signée sur 2 octets (0 à 65536)
GL_INT Valeur sur 4 octets représentant un entier signé
GL_UNSIGNED_INT Non signé votre entier !
GL_FLOAT Nombre flottant
GL_2_BYTES 2 octets valeur non signée calculée comme suit : 1er octet *256 + octet suivant
GL_3_BYTES 3 octets 1er octet *65536 + 2ième octet * 256 + 3ième octet
GL_4_BYTES 4 octets en suivant la philosophie du précédent !

Enfin list qui est un pointeur sur votre tableau.

 

Exemple

Voici les 2 classeurs, mais en utilisant une display list.

Image non trouvée !

 

Annexes

OpenGL pour Linux, Windows, Android...