Display list ou liste d'affichage sous OpenGL pour Windows
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.
Annexes
OpenGL pour Linux, Windows, Android...