( Application Programming Interface) API graphique ( Application Programming Interface) Couche entre le programmeur et le matériel (ou d’autres programmes) Environ 250 procédures et fonctions Définition des objets Opérations pour applications interacives
Application Application Graphics Package OpenGL API Matériel et programmes Périphérique de sortie Périphérique d’entrée Périphérique d’entrée
Machine à états reconfigurable En entrée, données 2D ou 3D En sortie un tampon image On modifie l’état pour changer les fonctionnalités
Largement utilisé et maintenu Très bien documenté : www.opengl.org Facile à utiliser Traitement de la géométrie et des pixels
Développé par SGI au début des années 90 SGI n’est plus propriétaire License gratuite
Evolution controlée par OpenGL ARB (architecture review board) Une voix par société Microsoft (parti en mars 2003), Dell, IBM, Intel, Matrox, 3Dlabs, Apple, Sun Microsystems, HP, SGI, nVidia, ATI, Evans & Sutherland It is up to other companies such as Microsoft and SUN to implement the OpenGL specification for thier operating system and up to the card manufacturers such as nVidia to create hardware which runs OpenGL.
Applications temps réel (3D Studio Max, Maya, Blender, …) Environnements virtuels interactifs Jeux videos (Quake, Warcraft 3, Medal of Honor, Doom 3, …)
Interprétation client / serveur Le programme (client) invoque des commandes Eg.activation des lumières, rendu de triangles, etc. Les commandes sont interprétées et traités par le serveur “GL”
Ne fournit pas le moyen de construire des scènes complexes Utiliser pour cela une API plus haut-niveau (OpenInventor, Java3D) Ne gère pas les périphériques Souris, son... Ne gère pas l’interface-homme-machine Pour cela nous utiliserons la GLUT (Graphics Library Utility Toolkit)
#include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h>
OpenGL est indépendant des plateformes Un système de fenêtrage est nécessaire pour Interaction Ouverture / fermeture fenêtres Gestion des événements Options: GLX (*nix) WGL (windows) GLUT (indépendant du système de fenêtrage)
glutInitWindowSize glutInitDisplayMode glutCreateWindow
Dans un tampon d’images Primitives OpenGL Un ensemble de sommets Un sommet définit: Un point L’extrémité d’un segment Le sommet d’un polygone
Données associées à un sommet coordonnées couleur normale coordonnées de texture
Points Ligne Polygone Triangle Quad Quad strip Triangle strip Triangle Fan
Interpolé (Smooth, Gouraud) Plaquage de textures Fil de fer (Wireframe) Plat (Flat Shading) Une seule couleur par polygone Interpolé (Smooth, Gouraud) Interpolation des couleurs des sommets sur le polygone Plaquage de textures La couleur de chaque pixel est récupérée dans une image
glEnable, glDisable, glCullFace, glPolygonMode, glLightModel, etc.
Operations sur primitives Géométriques Conversion en mode Point Operations sur les fragments Sommets Mémoire tampon Images ou Pixels Opérations Sur pixels Mémoire texture
Manipulation de rectangles de pixels glDrawPixels, glReadPixels, glCopyPixels déplacent des rectangles de pixels de et vers le tampon image glBitmap prend en entrée une image binaire dont les pixels à 1 sont dessinés dans la mémoire image (utile pour dessiner du texte)
Soit zj la valeur présente dans le z-buffer A chaque fois qu’un fragment i est dessiné, le zi (distance au point de vue) est comparé et peut-être stocké dans le tampon de profondeur (Z-buffer) Soit zj la valeur présente dans le z-buffer Si zj > zi le fragment est dessiné Sinon rien n’est fait
Spécifier l’utilisation d’un tampon de profondeur: glutInitDisplayMode(GLUT_DEPTH); A la mise à jour s’assurer que : glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST);
glBegin() glEnd() termine une liste de sommets et de ses attributs Les coordonnées d’une primitive sont données dans le sens inverse des aiguilles d’un montre
glBegin(GL_POINTS); glVertex3f(0.0f, 0.0f, 0.0f); glEnd();
glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd();
glBegin(GL_TRIANGLES);. glColor3f(1. 0f, 0. 0f, 0. 0f); //pure red glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); //pure red glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); //pure green glVertex3f(-1.0f, -1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); //pure blue glVertex3f(1.0f, -1.0f, 0.0f); glEnd();
Couleur indexée (Indexed Color) RGBA Red, Green, Blue, Alpha Un canal pour chaque couleur 8 bits/canal = 16 million de couleurs Couleur indexée (Indexed Color) Un petit nombre de couleur accédées grâce à un indice dans une table de couleurs 8 bits = 256 colors
Deux objets de couleurs (Cs, Cf) sont composés au moment du rendu Utilisation d’un modèle RGBA, ma 4ème composante (alpha) spécifie la transparence Alpha = 0 ; polygone complètement transparent Alpha = 1 ; polygone opaque Deux objets de couleurs (Cs, Cf) sont composés au moment du rendu C = alpha*Cs + (1 - alpha) Cf Cs est la couleur du nouveau fragment transparent Cf est la couleur déjà présente dans la mémoire tampon
La visualisation est réalisée en 2 étapes Positionnement des objets Matrice de transformation : model view Projection dans la vue matrice de transformation projection OpenGL fournit des matices de projection perspectives et parallèles (orthographic) La caméra par défaut est toujours située à l’origine et pointe vers la direction des z négatifs
Positionne les objets dans la scène Formée par la concaténation de transformations simples glRotate(theta, x,y,z) glTranslate(x,y,z) glScale(x,y,z) L’ordre est important
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glTranslatef(0.0f, 0.0f, -10.0f); glRotatef(45.0f, 0.0f, 1.0f, 0.0f); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd();
Projection orthographique Projection parallèle, le volume de vue est un cube glOrtho(left, right, bottom, top, front, back)
Projection perspective glFrustum, gluPerspective Le volume de vue et de découpage est une pyramide
gluLookAt spécifie gluLookAt(10,10,10,1,2,3,0,0,1); La position de la caméra (position de l’oeil) Le point visé (look at) L’orientation de la caméra (vecteur vertical, up) gluLookAt(10,10,10,1,2,3,0,0,1); Oeil en (10,10,10) Point visé (1,2,3) Up (0,0,1)
//Projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, 1, 1, 100); gluLookAt(10,10,10,1,2,3,0,0,1) //Transformations sur les objets glMatrixMode(GL_MODELVIEW) glLoad Identity(); glTranslate(1,1,1); glRotatef(90, 1,0,0); DrawObject();
glPushMatrix retourne une copie du sommet de la matrice glPopMatrix détruit le sommet de la matrice
En C, si l’on déclare la matrice m[4][4], l’élément m[I][j] est sur la ième ligne et la jème colonne. Avec OpenGL, l’élément m[I][j] correspond à la ième colonne et à la jème ligne de la matrice de transformation. Pour éviter les erreurs une méthode consiste à déclarer les matrices sous la forme m[16]
m0 m4 m8 m12 m1 m5 m9 m13 m2 m6 m10 m14 m3 m7 m11 m15