300 likes | 377 Views
Visualisation avec OpenGL. Jérémie Allard 4 Novembre 2002. Plan. Présentation Exemple Transformations Objets Matériaux et Lumières Textures Techniques Avancées. Présentation: Historique. Avant 1992: IRIS GL développé par SGI.
E N D
Visualisation avec OpenGL Jérémie Allard 4 Novembre 2002
Plan • Présentation • Exemple • Transformations • Objets • Matériaux et Lumières • Textures • Techniques Avancées
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
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 d’abstraction du système
Présentation:Concepts • Framebuffer: buffer contenant l’image 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 l’image (composante R G B) • Z Buffer: Distances (calcul des parties cachées • Stencil Buffer, Alpha Buffer, Accumulation Buffer
Présentation:Concepts (2) • Pixel: point d’une image • Vertex: sommet d’un 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
Exemple:Structure • La structure d’un programme OpenGL est généralement: • Initialisation • Boucle principale: • Mise a jour des données • Calcul de l’image (render) • Affichage de la nouvelle image (swap) • Le code dépend du système utilisé (X/Windows, Win32, GLUT, VR Juggler)
Exemple:Afficher un triangle // render_triangle.c #include <GL/gl.h> 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 }
Exemple: Programme principal avec GLUT (1) // main_glut.c #include <GL/glut.h> 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(); }
Exemple: Programme principal avec GLUT (2) void init() { // initialise la caméra glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, 1.3333, 1.0, 5000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void display() { // calcule et affiche une image render(); glutSwapBuffers(); } void idle() { // reaffiche une fois terminé glutPostRedisplay(); }
Exemple:Compilation avec GLUT • Compilation: gcc -o triangle main_glut.c render_triangle.c -lglut -lGLU -lGL -lXmu -lXext -lX11 -lm • Résultat:
Exemples:Notes • Je conseille de séparer le programme principal dépendant du système et les fonctions de l’application elle-même • portabilité sur d’autres 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 d’arguments • f pour float, d pour double, i pour int
Transformations • Chaque vertex subit des transformations avant d’être affiché. • Position et orientation de l’objet dans la scène • Inverse de la position et l’orientation 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
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
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
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 l’axe 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);
Transformations:Exemple // render_rotate.c #include <GL/gl.h> 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; }
Transformations:Notes • Si aucune transformation n’est spécifiée, l ’axe X est dirigé vers la droite, l’axe Y vers le haut, l’axe Z vers l’avant, et la caméra est en (0,0,0) • L’ordre des transformations est très important. Les transformations spécifiées en derniers s’appliquent en premier. • Inversion de la translation et la rotation:
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 d’un 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 d’optimisations dépendantes de la carte graphique (placer les données dans la mémoire vidéo pour les cartes nVIDIA).
Objets:Primitives • glBegin(type):
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(); }
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; }
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
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); …
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 d’un 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.
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(); … }
Références • OpenGL Programming Guide (The Red Book) http://ask.ii.uib.no/ebt-bin/nph-dweb/dynaweb/SGI_Developer/OpenGL_PG/ • OpenGL Reference Manual (The Blue Book) http://ask.ii.uib.no/ebt-bin/nph-dweb/dynaweb/SGI_Developer/OpenGL_RM/ • http://www.opengl.org : site officiel. Forums • http://nehe.gamedev.net : le site de tutoriels OpenGL • http://hufo.planet-d.net : mon site :-) (demos)