1 / 30

Visualisation avec OpenGL

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.

rad
Download Presentation

Visualisation avec OpenGL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 d’abstraction du système

  5. 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

  6. 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

  7. 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)

  8. 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 }

  9. 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(); }

  10. 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(); }

  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 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

  13. 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

  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 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);

  17. 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; }

  18. 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:

  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 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).

  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 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.

  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) 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)

More Related