Introduction to OpenGL. OpenGL: Open Graphics Library API graphique ( Application Programming...

Post on 03-Apr-2015

126 views 0 download

Tags:

transcript

Introduction to OpenGL

OpenGL: Open Graphics Library

• API graphique

( Application Programming Interface)– Couche entre le programmeur et le matériel (ou

d’autres programmes)

• Environ 250 procédures et fonctions– Définition des objets– Opérations pour applications interacives

Vue du programmeurApplication

Graphics Package

OpenGL API

Matériel et programmes

Périphérique de sortie Périphérique d’entrée

Application

Périphérique d’entrée

Qu’est-ce que OpenGL ?

• Machine à états reconfigurable– En entrée, données 2D ou 3D– En sortie un tampon image– On modifie l’état pour changer les

fonctionnalités

Qu’est-ce que OpenGL ?

• Largement utilisé et maintenu

• Très bien documenté : www.opengl.org

• Facile à utiliser

• Traitement de la géométrie et des pixels

Histoire d’OpenGL

• Développé par SGI au début des années 90

• SGI n’est plus propriétaire

• License gratuite

Histoire OpenGL

• Evolution controlée par OpenGL ARB(architecture review board)– Une voix par société

• Microsoft (parti en mars 2003), Dell, IBM, Intel, Matrox, 3Dlabs, Apple, Sun Microsystems, HP, SGI, nVidia, ATI, Evans & Sutherland

OpenGL est utilisé pour

• Applications temps réel (3D Studio Max, Maya, Blender, …)

• Environnements virtuels interactifs

• Jeux videos (Quake, Warcraft 3, Medal of Honor, Doom 3, …)

Fonctionnement de OpenGL

• Interprétation client / serveur

– Le programme (client) invoque des commandes• Eg.activation des lumières, rendu de triangles, etc.

– Les commandes sont interprétées et traités par le serveur

• “GL”

OpenGL

• Ne fournit pas le moyen de construire des scènes complexes– Utiliser pour cela une API plus haut-niveau

(OpenInventor, Java3D)

• Ne gère pas les périphériques– Souris, son...

• Ne gère pas l’interface-homme-machine– Pour cela nous utiliserons la GLUT

• (Graphics Library Utility Toolkit)

Bibliothèques

• #include <GL/gl.h>

• #include <GL/glu.h>

• #include <GL/glut.h>

Interaction avec le système de fenêtrage

• OpenGL est indépendant des plateformes• Un système de fenêtrage est nécessaire pour

– Interaction– Ouverture / fermeture fenêtres– Gestion des événements

• Options:– GLX (*nix)– WGL (windows)– GLUT (indépendant du système de fenêtrage)

Création d’une fenêtre avec GLUT

• glutInitWindowSize

• glutInitDisplayMode

• glutCreateWindow

Rendu d’une primitive géométrique

• Dans un tampon d’images

• Primitives OpenGL– Un ensemble de sommets– Un sommet définit:

• Un point

• L’extrémité d’un segment

• Le sommet d’un polygone

Rendu OpenGL

• Données associées à un sommet– coordonnées– couleur– normale– coordonnées de texture

Primitives OpenGL

Points Ligne Polygone

Triangle Quad Quad strip

Triangle strip Triangle Fan

Modes de rendu

• Fil de fer (Wireframe)

• Plat (Flat Shading)– Une seule couleur par polygone

• Interpolé (Smooth, Gouraud)– Interpolation des couleurs des sommets sur le polygone

• Plaquage de textures– La couleur de chaque pixel est récupérée dans une image

Configuration de ces options

• glEnable, glDisable,

• glCullFace, glPolygonMode, glLightModel, etc.

Pipeline OpenGL

Sommets

Images ouPixels

Operationssur primitives Géométriques

Conversionen mode

Point

Operations

sur les fragments

OpérationsSur pixels

Mémoiretexture

Mém

oire tampon

Opérations sur les pixels

• Manipulation de rectangles de pixels• glDrawPixels, glReadPixels, glCopyPixels

déplacent des rectangles de pixels de et vers le tampon image

• glBitmap prend en entrée une image binaire dont les pixels à 1 sont dessinés dans la mémoire image (utile pour dessiner du texte)

Elimination des parties cachées

• A chaque fois qu’un fragment i est dessiné, le zi (distance au point de vue) est comparé et peut-être stocké dans le tampon de profondeur (Z-buffer)

• Soit zj la valeur présente dans le z-buffer – Si zj > zi le fragment est dessiné– Sinon rien n’est fait

Elimination des parties cachées

• Spécifier l’utilisation d’un tampon de profondeur:– glutInitDisplayMode(GLUT_DEPTH);

• A la mise à jour s’assurer que :– glClear(GL_DEPTH_BUFFER_BIT);

• glEnable(GL_DEPTH_TEST);

Dessiner avec OpenGL

• glBegin()

• glEnd() termine une liste de sommets et de ses attributs

• Les coordonnées d’une primitive sont données dans le sens inverse des aiguilles d’un montre

Exemple ; dessin d’un point

glBegin(GL_POINTS);

glVertex3f(0.0f, 0.0f, 0.0f);

glEnd();

Un triangle

glBegin(GL_TRIANGLES);glVertex3f(0.0f, 1.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 0.0f);glVertex3f(1.0f, -1.0f, 0.0f);

glEnd();

Un triangle avec des sommets de couleurs

différentesglBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); //pure redglVertex3f(0.0f, 1.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f); //pure greenglVertex3f(-1.0f, -1.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); //pure blueglVertex3f(1.0f, -1.0f, 0.0f);

glEnd();

Modèles de couleurs avec OpenGL

• RGBA– Red, Green, Blue, Alpha– Un canal pour chaque couleur– 8 bits/canal = 16 million de couleurs

• Couleur indexée (Indexed Color)– Un petit nombre de couleur accédées grâce à un

indice dans une table de couleurs• 8 bits = 256 colors

Transparence avec OpenGL

• Utilisation d’un modèle RGBA, ma 4ème composante (alpha) spécifie la transparence– Alpha = 0 ; polygone complètement transparent

– Alpha = 1 ; polygone opaque

• Deux objets de couleurs (Cs, Cf) sont composés au moment du rendu– C = alpha*Cs + (1 - alpha) Cf

– Cs est la couleur du nouveau fragment transparent

– Cf est la couleur déjà présente dans la mémoire tampon

Visualisation avec OpenGL

• La visualisation est réalisée en 2 étapes– Positionnement des objets

• Matrice de transformation : model view

– Projection dans la vue• matrice de transformation projection

– OpenGL fournit des matices de projection perspectives et parallèles (orthographic)

– La caméra par défaut est toujours située à l’origine et pointe vers la direction des z négatifs

Matrice ModelView

• Positionne les objets dans la scène

• Formée par la concaténation de transformations simples– glRotate(theta, x,y,z)– glTranslate(x,y,z)– glScale(x,y,z)

• L’ordre est important

Transformations de modélisation

glTranslatef(0.0f, 0.0f, -10.0f);glRotatef(45.0f, 0.0f, 1.0f, 0.0f);

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f);

glEnd();

Visualisation

• Projection orthographique– Projection parallèle, le volume de vue est un cube– glOrtho(left, right, bottom, top, front, back)

Visualisation• Projection perspective

– glFrustum, gluPerspective– Le volume de vue et de découpage est une pyramide

Positionnement de la camera

• gluLookAt spécifie– La position de la caméra (position de l’oeil)– Le point visé (look at)– L’orientation de la caméra (vecteur vertical, up)

• gluLookAt(10,10,10,1,2,3,0,0,1);– Oeil en (10,10,10)– Point visé (1,2,3)– Up (0,0,1)

Exemple de visualisation complet//ProjectionglMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60, 1, 1, 100);gluLookAt(10,10,10,1,2,3,0,0,1)

//Transformations sur les objetsglMatrixMode(GL_MODELVIEW)glLoad Identity();glTranslate(1,1,1);glRotatef(90, 1,0,0);DrawObject();

Piles de matrices

• glPushMatrix retourne une copie du sommet de la matrice

• glPopMatrix détruit le sommet de la matrice

Attention !! Les matrices de

transformation sous OpenGL sont des matrices colones • En C, si l’on déclare la matrice m[4][4],

l’élément m[I][j] est sur la ième ligne et la jème colonne.

• Avec OpenGL, l’élément m[I][j] correspond à la ième colonne et à la jème ligne de la matrice de transformation. Pour éviter les erreurs une méthode consiste à déclarer les matrices sous la forme m[16]

Matrice OpenGL

m0 m4 m8 m12

m1 m5 m9 m13

m2 m6 m10 m14

m3 m7 m11 m15