Afficher une image

Figure 11: L'affichage d'une image à l'aide de la fonction glDrawPixels() dans le cas d'une projection orthographique.
\begin{figure}\begin{center}
\epsfig{figure=Figures/fig1.eps, width= 10cm}\end{center}\end{figure}

La fonction d'affichage d'une image (ou, de manière générale, d'une matrice de pixels) est la fonction glDrawPixels(). Cette fonction prend en paramètres :
glDrawPixels( ImgWidth, ImgHeight, ImgFormat, DataType, Image )

Comme cela a été dit précédemment, les primitives dans OpenGL sont toujours de nature tri-dimensionnelle et sont donc transformées (point de vue et projection) en fonction des transformations courantes. Une image n'échappe pas à la règle et possède donc une position dans l'espace ; son orientation dans l'espace étant définie par les axes x et y du repère de la scène (voir figure 11). La position dans l'espace de l'image est, par défaut, (0, 0, 0). Cette position courante est spécifiée/modifiée à l'aide la fonction glRasterPosxx(...), ceci de la même manière qu'un sommet par deux, trois ou quatre coordonnées : {(x, y),(z = 0, w = 1)}), {(x, y, z),w = 1} ou {(x, y, z, w)} de type réels (glRasterPos234f()), entiers (glRaster234i()) ou autre.

À noter : la librairie MESA [Mes] propose une fonction :

glWindowPosMESAxx()
qui permet de positionner le premier pixel de l'image dans la fenêtre d'affichage sans se préoccuper de la projection ou du point de vue appliquée.

Enfin, OpenGL impose, par défaut, que la matrice de pixels soit constituée de lignes contenant un nombre de bytes multiple de quatre. Pour modifier cela, il faut utiliser la fonction :

 glPixelStorei(GL_UNPACK_ALIGNMENT, 1-2-4-8);

avec pour paramètre l'alignement souhaité (1,2,4 ou 8). Dans le cas général, les bytes sont stockés les uns à la suite des autres et l'alignement sera donc 1. À noter ici que cette fonction sert aussi à afficher une partie de l'image uniquement ou à définir des modes de stockage particulier des pixels (voir [WND97] pour plus d'informations).

La procédure classique d'affichage d'une image sera donc :

 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 glRasterPos2i(0,0);
 /* glWindowPosMESA2i(0,0); */  /* positionnement independant des */
                                /* trans. proj. et point de vue */
 glDrawPixels( 512, 512, GL_RGB, GL_UNSIGNED_BYTE, MatricePixels);

Edmond Boyer
2001-03-07