30
1 Visualisation avec OpenGL Jérémie Allard 4 Novembre 2002

Visualisation avec OpenGL

  • Upload
    rad

  • View
    22

  • Download
    0

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: Visualisation avec OpenGL

1

Visualisation avec OpenGL

Jérémie Allard

4 Novembre 2002

Page 2: Visualisation avec OpenGL

2

Plan

• Présentation• Exemple• Transformations• Objets• Matériaux et Lumières• Textures• Techniques Avancées

Page 3: Visualisation avec OpenGL

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

Page 4: Visualisation avec OpenGL

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

Page 5: Visualisation avec OpenGL

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

Page 6: Visualisation avec OpenGL

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

Page 7: Visualisation avec OpenGL

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)

Page 8: Visualisation avec OpenGL

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

}

Page 9: Visualisation avec OpenGL

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

}

Page 10: Visualisation avec OpenGL

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

}

Page 11: Visualisation avec OpenGL

11

Exemple:Compilation avec GLUT

• Compilation:gcc -o triangle main_glut.c render_triangle.c -lglut -

lGLU -lGL -lXmu -lXext -lX11 -lm

• Résultat:

Page 12: Visualisation avec OpenGL

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

Page 13: Visualisation avec OpenGL

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

Page 14: Visualisation avec OpenGL

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

Page 15: Visualisation avec OpenGL

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

Page 16: Visualisation avec OpenGL

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

Page 17: Visualisation avec OpenGL

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;

}

Page 18: Visualisation avec OpenGL

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:

Page 19: Visualisation avec OpenGL

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

Page 20: Visualisation avec OpenGL

20

Objets:Primitives

• glBegin(type):

Page 21: Visualisation avec OpenGL

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

}

Page 22: Visualisation avec OpenGL

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;

}

Page 23: Visualisation avec OpenGL

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

Page 24: Visualisation avec OpenGL

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

Page 25: Visualisation avec OpenGL

25

Matériaux et Lumières:Exemple (2)

Page 26: Visualisation avec OpenGL

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.

Page 27: Visualisation avec OpenGL

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

Page 28: Visualisation avec OpenGL

28

Textures:Exemple (2)

Page 29: Visualisation avec OpenGL

29

Techniques Avancées

Page 30: Visualisation avec OpenGL

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)