1 visualisation avec opengl jérémie allard 4 novembre 2002
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 IDloadTGA("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)