1 Visualisation avec OpenGL Jérémie Allard 4 Novembre 2002
2 Plan Présentation Exemple Transformations Objets Matériaux et Lumières Textures Techniques Avancées
3 Présentation: Historique Avant 1992: IRIS GL développé par SGI. 1992: Création du standard OpenGL, Open Graphic Library, controlé par l ARB, Architecture Review Board. –3DLabs, Apple, ATI, Dell, Evans&Sutherland, HP, IBM, Intel, Matrox, Microsoft, nVIDIA, SGI, Sun Spécification actuelle: OpenGL 1.4 Futur: OpenGL 2.0
4 Présentation: Structure API bas niveau Langage C Plusieurs composants: –GL : librairie graphique, indépendante du système –GLU : fonctions utilitaires (objects prédéfinis, courbes) –GLX / WGL /... : interface avec le système (GLX sous X/Windows, WGL sous Win32). –GLUT (facultatif) : Toolkit dabstraction du système
5 Présentation: Concepts Framebuffer: buffer contenant limage affichée sur lécran. Utilise le Double-Buffering: –Front buffer: image actuellement affichée –Back buffer: image en cours de calcul Plusieurs composantes: –Color Buffer: Couleurs de limage (composante R G B) –Z Buffer: Distances (calcul des parties cachées –Stencil Buffer, Alpha Buffer, Accumulation Buffer
6 Présentation: Concepts (2) Pixel: point dune image Vertex: sommet dun objet. Possède une position 3D et des attributs facultatifs: –Normal: vecteur normal à la surface –Color: couleur (et transparence) –TexCoord: coordonnée de mapping de la texture Polygone: primitive d affichage. Liste de n points (généralement des triangles). Objet: ensemble de polygones
7 Exemple: Structure La structure dun programme OpenGL est généralement: –Initialisation –Boucle principale: Mise a jour des données Calcul de limage (render) Affichage de la nouvelle image (swap) Le code dépend du système utilisé (X/Windows, Win32, GLUT, VR Juggler)
8 Exemple: Afficher un triangle // render_triangle.c #include void render() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1.0f,0.0f,0.0f); // couleur V1 glVertex3f( 0.0f, 1.0f,-3.0f); // position V1 glColor3f(0.0f,1.0f,0.0f); // couleur V2 glVertex3f(-1.0f,-1.0f,-3.0f); // position V2 glColor3f(0.0f,0.0f,1.0f); // couleur V3 glVertex3f( 1.0f,-1.0f,-3.0f); // position V3 glEnd(); // GL_TRIANGLES }
9 Exemple: Programme principal avec GLUT (1) // main_glut.c #include void init(); void display(); void idle(); int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutIdleFunc(idle); glutMainLoop(); }
10 Exemple: Programme principal avec GLUT (2) void init() { // initialise la caméra glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, , 1.0, ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void display() { // calcule et affiche une image render(); glutSwapBuffers(); } void idle() { // reaffiche une fois terminé glutPostRedisplay(); }
11 Exemple: Compilation avec GLUT Compilation: gcc -o triangle main_glut.c render_triangle.c -lglut - lGLU -lGL -lXmu -lXext -lX11 -lm Résultat:
12 Exemples: Notes Je conseille de séparer le programme principal dépendant du système et les fonctions de lapplication elle-même –portabilité sur dautres systèmes (comme Net Juggler). Le triangle a été spécifié en immediate mode : les vertice sont spécifiés un par un Convention: beaucoup de fonctions OpenGL utilisent un suffixe pour spécifier le nombre et le type darguments –f pour float, d pour double, i pour int
13 Transformations Chaque vertex subit des transformations avant dêtre affiché. –Position et orientation de lobjet dans la scène –Inverse de la position et lorientation de la caméra –Projection 3D -> 2D Les 2 premières transformations sont stockées dans la matrice MODELVIEW La projection est stockée dans la matrice PROJECTION
14 Transformations: Piles de matrices La matrice de travaille est spécifiée par la commande glMatrixMode : –glMatrixMode(GL_PROJECTION) –glMatrixMode(GL_MODELVIEW) OpenGL stocke pour chacune une pile de matrices –glPushMatrix() sauvegarde la matrice courante –glPopMatrix() restaure une matrice précédente
15 Transformations: Projection glLoadIdenty() réinitialise la matrice courante. La projection est spécifiée par la commande gluPerspective(fovy, aspect, zNear, zFar): –fovy: angle de vision horizontal –aspect: aspect ratio de la fenêtre (1.333 pour un ecran) –zNear: distance z minimale –zFar: distance z maximale
16 Transformations: Trans- lation, Rotation, Scaling glTranslate[d/f](x,y,z) déplace l'objet du vecteur spécifié –Ex: glTranslatef(0.0f, 0.0f, -6.0f); glRotate[d,f](angle,x,y,z) tourne l'objet autour de laxe spécifié (angle en degré) –Ex: glRotatef(90.0f, 0.0f, 1.0f, 0.0f); glScale[d/f](x,y,z) étire l'objet selon les facteurs spécifié pour chacun des axes –Ex: glScalef(2.0f, 2.0f, 2.0f);
17 Transformations: Exemple // render_rotate.c #include int nbframe=0; void render() { glClear(…); // comme Exemple 1 glPushMatrix(); glTranslatef(0,0,-3); glRotatef(nbframe,0,1,0); glBegin(GL_TRIANGLES); … // comme Exemple 1 glEnd(); // GL_TRIANGLES glPopMatrix(); ++nbframe; }
18 Transformations: Notes Si aucune transformation nest spécifiée, l axe X est dirigé vers la droite, laxe Y vers le haut, laxe Z vers lavant, et la caméra est en (0,0,0) Lordre des transformations est très important. Les transformations spécifiées en derniers sappliquent en premier. –Inversion de la translation et la rotation:
19 Objets Un objet est un ensemble de polygones. Plusieurs façons de spécifier un objet: –immediate mode: spécification directe. Très simple. glBegin(type); … glVertex … glEnd(); –vertex array: utilisation dun tableau stockant les vertices. Plus efficace, mais plus compliqué –display list: regroupements de commandes en «batch». Anciennement le plus rapide mais trop limité. –Il existe beaucoup doptimisations dépendantes de la carte graphique (placer les données dans la mémoire vidéo pour les cartes nVIDIA).
20 Objets: Primitives glBegin(type) :
21 Objets: Exemple procédural void renderAxeX() { glBegin(GL_QUADS); // base glVertex3f(0,-0.1f,-0.1f); glVertex3f(0, 0.1f,-0.1f); glVertex3f(0, 0.1f, 0.1f); glVertex3f(0,-0.1f, 0.1f); glEnd(); glBegin(GL_TRIANGLE_FAN); // cotés glVertex3f(1,0,0); glVertex3f(0,-0.1f,-0.1f); glVertex3f(0, 0.1f,-0.1f); glVertex3f(0, 0.1f, 0.1f); glVertex3f(0,-0.1f, 0.1f); glVertex3f(0,-0.1f,-0.1f); glEnd(); }
22 Objets: Exemple procédural (2) void render() { glEnable(GL_DEPTH_TEST); glPushMatrix(); glTranslatef(0,-1,-3); glRotatef(nbframe,0,1,0); glClear(…); glColor3f(1,0,0); renderAxeX(); // axe X glRotatef(90,0,0,1); glColor3f(0,1,0); renderAxeX(); // axe Y glRotatef(90,0,-1,0); glColor3f(0,0,1); renderAxeX(); // axe Z glPopMatrix(); ++nbframe; }
23 Matériaux et Lumières OpenGL supporte le model de lumière Phong: C = Ca + Cd.(N.L) + Cs.(N.K) shininess –C : couleur finale –Ca : couleur ambiante –Cd : couleur diffuse –Cs : couleur specular –N : vecteur normal de la surface –L : vecteur unitaire reliant le vertex a la lumiere –K : 1/2 vecteur (vecteur au milieu de L et du vecteur reliant la vertex a la caméra). –Shininess: puissance du spécular
24 Matériaux et Lumières: Exemple … glPushMatrix(); glRotatef(nbframe,1,0,0); glRotatef(nbframe/2,0,0,1); GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glPopMatrix(); GLUquadricObj* sph = gluNewQuadric (); gluQuadricOrientation(sph, GLU_OUTSIDE); gluSphere(sph, 1, 32,32); gluDeleteQuadric(sph); …
25 Matériaux et Lumières: Exemple (2)
26 Textures Une texture est une image pouvant être appliqué a un objet (en général pour spécifier une couleur). Elle est en général charger a partir dun fichier. De nombreux codes existent sur internet pour différents formats. A chaque vertex il faut spécifier les coordonnées de mapping (2 composantes u et v) spécifiant le point de la texture appliqué sur ce vertex.
27 Textures: Exemple #include "tga.h" unsigned int textureID = 0; void initgl() { glGenTextures(1, &textureID); // crée un ID loadTGA("logo_id.tga",textureID); // chage la texture } void render() { … glBindTexture(GL_TEXTURE_2D, textureID); glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glColor3f(1.0f,1.0f,1.0f); glTexCoord2f(1,1); glVertex3f( 1.0f, 1.0f, 0.0f); glColor3f(1.0f,0.0f,0.0f); glTexCoord2f(0,1); glVertex3f(-1.0f, 1.0f, 0.0f); glColor3f(0.0f,1.0f,0.0f); glTexCoord2f(0,0); glVertex3f(-1.0f,-1.0f,0.0f); glColor3f(0.0f,0.0f,1.0f); glTexCoord2f(1,0); glVertex3f( 1.0f,-1.0f,0.0f); glEnd(); … }
28 Textures: Exemple (2)
29 Techniques Avancées
30 Références OpenGL Programming Guide (The Red Book) OpenGL Reference Manual (The Blue Book) : site officiel. Forums : le site de tutoriels OpenGL : mon site :-) (demos)