Introduction - Université de Sherbrooke

Transcription

Introduction - Université de Sherbrooke
IMN428
Chapitre 1 - Introduction
Olivier Godin
Université de Sherbrooke
22 janvier 2014
Présentation
1 / 40
Pipeline graphique
1
Pipeline graphique
2
Introduction à OpenGL
3
Références
Présentation
2 / 40
Pipeline graphique
Cette section présente une introduction au concept de pipeline
graphique.
Celui-ci est composé des différentes étapes du rendu d’une scène
3D, du positionnement des points dans l’espace à la discrétisation des
objets en pixels pour l’affichage sur un écran d’ordinateur.
Présentation
3 / 40
Pipeline graphique
Une scène 3D typique est composée de plusieurs objets distincts,
chacun composé d’un ensemble de points (xi , yi , zi ) appelés vertex.
On se retrouve alors dans l’une des situation suivantes :
1
On connaît les relations entre les points et on peut construire (et
afficher) l’objet ; ou
2
On ne connaît pas ces relations et elles doivent être estimées
pour pouvoir construire l’objet.
Présentation
4 / 40
Pipeline graphique
Les relations entre les points portent le nom de primitives
graphiques. Elles décrivent comment construire les surfaces d’un
objet à partir d’une liste de points. La librairie OpenGL définit 10
primitives graphiques.
Bien qu’elles puissent toutes être utilisées, la plupart des surfaces
3D seront définies à partir de triangles.
Présentation
5 / 40
Pipeline graphique
!
"#$%&'&()&*+(,-+.&/+(&
!
0
2
1
3
Points
0
1
2
5
4
5
1
2
2
5
1
Line Loop
0
4
0
2
0
Line Strip
Lines
4
3
0
3
0
3
4
5
4
1
2
3
4
3
0
2
1
4
5
Quads
5
1
Triangle Strip
Triangles
0
3
6
3
1
2
Triangle Fan
1
4
6
7
6
2
0
2
6
3
1
3
5
Quad Strip
7
4
Polygon
5
!
!"#$%&' ()()! "#$! %&$'()! *+,-.-/! 0$1+'$2! 3$'! 3/&$2! 41! 5-.&#+62! &-+7+3+8$9! "#$! ':7,$-2!
+'0+6.3$!3#$!4-0$-!+'!;#+6#!3#$!8$-3+6$2!.-$!2&$6+1+$0!14-!$.6#!&-+7+3+8$!3/&$9!
F IGURE: Primitives graphiques permises par OpenGL, tiré de [2]
&*$3$2!'$$02!34!,$!<'4;'9!"#$-$!$=+23!%&$'()!$=3$'2+4'2!3#.3!.**4;!3#$!&-45-.7!
-:''+'5!4'!3#$!>?@!34!0$3$-7+'$!;#$'!.!&.-3+6:*.-!2$3!41!-$'0$-+'5!6477.'02!
#.8$! 1+'+2#$0! $=$6:3+'5! 4'! 3#$! (?@9! A:6#! 2/'6#-4'+B.3+4'! #.2! 3#$! 3$'0$'6/! 34!
Présentation
2*4;!04;'!.!CD!5-.&#+62!.&&*+6.3+4'E!24!+3!+2!:2:.**/!.84+0$0!;#$'$8$-!&422+,*$!
6 / 40
Processeur graphique
Un ordinateur moderne possède un processeur graphique dédié
(GPU) qui exécute des instructions indépendamment du processeur
central (CPU).
Présentation
7 / 40
Processeur graphique
Le CPU envoie des directives de rendu au GPU qui s’occupe
d’effectuer les opérations, tandis que le CPU peut continuer son travail.
Une application communique avec le GPU en envoyant des
instructions à une librairie graphique (comme OpenGL ou DirectX),
qui à son tour envoie des commandes au pilote (driver) qui lui, parle le
langage natif du GPU.
Présentation
8 / 40
Processeur graphque
Une processeur graphique possède aussi sa propre mémoire : la
VRAM, pour video random access memory. Les données qu’on y
retrouve peut être de toute forme, mais il y a aussi certains
incontournables :
les données de l’image : les valeurs de chaque pixel de la
fenêtre d’affichage de la scène 3D ;
les données de profondeur : les profondeurs associées aux
objets pour chacun des pixels de l’image ;
les données de texture : les images utilisées pour augmenter le
réalisme d’une scène.
Présentation
9 / 40
portantly, VRAM contains the front and back image buffers. The front image
buffer contains the exact pixel data that is visible in the viewport. The viewport is
Processeur
graphique
the area
of the display containing the rendered image and may be a subregion of
a window, the entire contents of a window, or the full area of the display. The
CPU
Main Memory
Application
Rendering commands
Vertex data
Texture data
Shader parameters
OpenGL or
DirectX
Graphics
Driver
Command buffer
Video Memory
GPU
Image
Buffers
Depth/stencil
Buffer
Texture
Maps
Vertex
Buffers
Figure 1.2. The communications that take place between the CPU and GPU.
F IGURE: Communication entre le CPU et le GPU
Présentation
10 / 40
Repères de points
Les données géométriques sont transmises au processeur graphique
sous la forme de points 3D. Une des tâches du GPU est de convertir
cette information de manière à la rendre compatible avec une fenêtre
2D sur l’écran de l’ordinateur.
Pour arriver à faire cette transformation, plusieurs repères ou
systèmes de coordonnées sont utilisés.
Présentation
11 / 40
Repères de points
L’ensemble des points appartenant à un même objet est
habituellement exprimé dans l’espace objet. Il s’agit d’un repère qui
est local à l’objet et qui est utilisé seulement par celui-ci. L’espace objet
sert à définir les positions relatives des points entre eux et non pas
dans l’espace.
La position et l’orientation de chaque objet 3D sont quant à eux
exprimés dans l’espace monde, un système de coordonnées global
qui lie tous les espaces objets ensembles.
Présentation
12 / 40
Repères de points
Avant de faire le rendu d’une scène, tous les objets doivent être
amenés dans l’espace caméra, un repère 3D où les axes x et y
correspondent respectivement à la largeur et la hauteur de la fenêtre
d’affichage.
Pour convertir directement des points d’un espace objet à l’espace
caméra, on utilise la matrice modelview.
Présentation
13 / 40
Repères de points
Une fois tous les points convertis dans l’espace caméra, on leur
applique une projection pour les amener dans l’espace homogène
tronqué.
On le dit homogène parce que les objets y respectent alors la logique
voulant que les éléments les plus près apparaissent plus gros que
ceux qui sont éloignés. On dit aussi que l’espace est tronqué,
puisque seules les parties visibles de la scène sont conservées, le
reste étant éliminé de la suite des calculs.
Présentation
14 / 40
Repères de points
Le dernier repère utilisé est l’espace image. On aboutit à celui-ci à
l’aide de la transformation viewport. Dans ce repère, les positions en x
et en y sont ramenés à un intervalle correspondant aux coordonnées
des pixels, tandis que la position en z est ramenée à l’intervalle [0, 1].
La position en z est par la suite stockée dans la carte de profondeur
(sur la VRAM) à des profondeurs entières, en fonction du nombre de
bits par pixel utilisé pour emmagasiner celle-ci.
Présentation
15 / 40
Once a model’s vertices have been transformed into camera space, they undergo a projection transformation that has the effect of applying perspective so
that geometry becomes smaller as the distance from the camera increases. (Pro-
Repères de points
World
Space
Object
Space
Model-view
transformation
Camera
Space
Projection
Homogeneous
Clip Space
Viewport transformation
Window
Space
Figure 1.3. The coordinate spaces appearing in the rendering pipeline. Vertex positions
FareIGURE
: Repères
de points
pipeline
graphique,
tiré deinto
[2]
submitted
to the graphics
library inselon
object le
space
and are eventually
transformed
window space for primitive rasterization.
Présentation
16 / 40
Discrétisation
Une fois obtenus les points dans l’espace image, le GPU doit décider
quels pixels de la fenêtre utiliser pour représenter la scène.
Le processus de remplissage de lignes horizontales de pixels
appartenant à un même objet est appelé rasterization.
Présentation
17 / 40
Introduction à OpenGL
1
Pipeline graphique
2
Introduction à OpenGL
3
Références
Présentation
18 / 40
Qu’est-ce qu’OpenGL
L’objectif du cours d’infographie est d’apprendre... l’infographie : ce
n’est pas un cours d’OpenGL. OpenGL est un outil utilisé dans le
cadre des travaux pour mettre en application la théorie.
La structure d’OpenGL est similaire à celle des autres systèmes
graphiques, tel que DirectX. Ainsi, ce qui est vu dans le cours
d’infographie restera valide lors de l’utilisation d’une autre librairie.
Présentation
19 / 40
Qu’est-ce qu’OpenGL
OpenGL est une librairie graphique (Open Graphics Library)
développée par Silicon Graphics.
Elle est constituée de plusieurs centaines de fonctions
graphiques.
OpenGL est indépendant du matériel, du langage utilisé et du
système d’exploitation.
OpenGL N’EST PAS un langage de programmation.
Présentation
20 / 40
Fonctions graphiques
Une librairie graphique doit non seulement pouvoir afficher de
l’information à l’écran, mais elle doit aussi être en mesure de gérer
les données fournies par l’utilisateur. 2.3 The OpenGL Application Programming
Application
program
Function calls
Data
Graphics
system
Output
Input
Input/Output
devices
FIGURE 2.3 Graphics system as a black box.
F IGURE: Application, librairie graphique et utilisateur
information on OpenGL and on other APIs is given in the Suggested Readings section
at the end of the chapter.
2.3.1 Graphics Functions
Our basic model of a graphics package is a black box, a term that engineers use to
denote a system whose properties are described only by its inputs and outputs; we
may know nothing about its internal workings. We can think of the graphics system
asPrésentation
a box whose inputs are function calls from an application program; measurements
21 / 40
Fonctions graphiques
Les fonctions fournies par OpenGL peuvent être séparées en six
catégories principales :
1
Les fonctions primitives qui permettent de manipuler les entités
géométriques de base. Celles-ci varieront selon la librairie utilisée.
Avec OpenGL, on a seulement accès aux points, aux segments,
et aux polygones.
2
Les fonctions attributs servent à définir l’allure des primitives
graphiques de base : couleur, texture, etc.
3
Les fonction de visualisation sont utiles pour définir les options
associées à la caméra virtuelle : position, orientation, type de
projection, etc.
Présentation
22 / 40
Fonctions graphiques
4
les fonctions de transformation permettent quant à elles de
positionner les points et les objets comme bon nous semble dans
la scène : translation, rotation, homothétie, etc.
5
les fonctions d’interaction font le lien entre les contrôleurs de
l’ordinateur (clavier, souris, trackpad, manette, etc) et le système
graphique.
6
les fonctions de contrôle établissent la relation entre le système
d’exploitation de l’ordinateur et le système graphique, entre autres
pour la gestion des fenêtres.
Présentation
23 / 40
L’interface OpenGL
Toutes les commandes et fonctions de OpenGL ont comme préfixe gl.
OpenGL propose des fonctions de bas niveau (point, segment,
polygones).
Les fonctions de haut niveau proviennent de librairies additionnelles
qui interagissent avec OpenGL : GLUT et GLU.
Présentation
24 / 40
L’interface OpenGL
GLUT (OpenGL utility toolkit) est une librairie permettant
l’interfaçage entre OpenGL et le matériel.
Elle ajoute à OpenGL des fonctions d’affichage et de gestion des
périphériques.
GLUT propose aussi des primitives géométrique de haut niveau :
sphère, cylindre, théière, etc.
Le préfixe des fonctions est glut.
Présentation
25 / 40
L’interface OpenGL
GLU (OpenGL utility library) est une autre librairie ajoutant des
fonctions de haut niveau à OpenGL.
GLU se spécialise dans les transformations géométriques, la
triangulation et le rendu des surfaces.
Le préfixe des fonctions est glu.
Présentation
26 / 40
Fonctions utiles
Une des fonctions de dessin de base dans OpenGL est
glVertex*(.), qui permet de dessiner un point dont les
coordonnées sont passées en paramètre. Il est nécessaire de spécifier
une dimension (2, 3 ou 4) et un type de données (float, int, short,
double, etc.) pour les coordonnées. Par exemple, glVertex2i(.)
dessinera un point 2D avec des coordonnées en int.
Tout dessin est une liste d’appels à la fonction glVertex*(.). La
liste d’appels doit commencer par glBegin(.) et se terminer par
glEnd(). Selon ce que l’on souhaite dessiner, les paramètres de
glBegin(.) varieront.
Présentation
27 / 40
Fonctions utiles
Points : glBegin(GL_POINTS)
Lignes : glBegin(GL_LINES)
Polygones : glBegin(GL_POLYGON)
Triangles : glBegin(GL_TRIANGLES)
Quadrilatères : glBegin(GL_QUADS)
Présentation
28 / 40
Exemple
glBegin(GL_POLYGON);
glVertex3f( 20.0,-4.0, 20.0);
glVertex3f(-20.0,-4.0, 20.0);
glVertex3f(-20.0,-4.0,-20.0);
glVertex3f( 20.0,-4.0,-20.0);
glEnd();
D’autres paramètres sont aussi possibles pour glBegin(.).
Présentation
29 / 40
Fonctions utiles
GL_LINE_STRIP permet de dessiner une suite de segments
rattachés les une aux autres.
GL_LINE_LOOP ajoute un segment à GL_LINE_STRIP afin de
boucler la boucle.
GL_TRIANGLE_STRIP utilisera quatre sommets pour dessiner
deux triangles adjacents.
GL_QUAD_STRIP utilisera six sommets pour dessiner deux
quadrilatères adjacents.
Le nombre d’appels à glVertex*(.) dépendra donc du paramètre
de glBegin(.).
Présentation
30 / 40
Fonctions utiles
!
"#$%&'&()&*+(,-+.&/+(&
!
0
2
1
3
Points
0
1
2
5
4
5
1
2
2
5
1
Line Loop
0
4
0
2
0
Line Strip
Lines
4
3
0
3
0
3
4
5
4
1
2
3
4
3
0
2
1
4
5
Quads
5
1
Triangle Strip
Triangles
0
3
6
3
1
2
Triangle Fan
1
4
6
7
6
2
0
2
6
3
1
3
5
Quad Strip
7
4
Polygon
5
!
!"#$%&' ()()! "#$! %&$'()! *+,-.-/! 0$1+'$2! 3$'! 3/&$2! 41! 5-.&#+62! &-+7+3+8$9! "#$! ':7,$-2!
+'0+6.3$!3#$!4-0$-!+'!;#+6#!3#$!8$-3+6$2!.-$!2&$6+1+$0!14-!$.6#!&-+7+3+8$!3/&$9!
F IGURE: Primitives graphiques permises par OpenGL, tiré de [2]
&*$3$2!'$$02!34!,$!<'4;'9!"#$-$!$=+23!%&$'()!$=3$'2+4'2!3#.3!.**4;!3#$!&-45-.7!
-:''+'5!4'!3#$!>?@!34!0$3$-7+'$!;#$'!.!&.-3+6:*.-!2$3!41!-$'0$-+'5!6477.'02!
#.8$! 1+'+2#$0! $=$6:3+'5! 4'! 3#$! (?@9! A:6#! 2/'6#-4'+B.3+4'! #.2! 3#$! 3$'0$'6/! 34!
Présentation
2*4;!04;'!.!CD!5-.&#+62!.&&*+6.3+4'E!24!+3!+2!:2:.**/!.84+0$0!;#$'$8$-!&422+,*$!
31 / 40
Fonctions utiles
Un polygone peut être dessiné de plusieurs façons :
En mode fil de fer : GL_LINE
Rempli avec la couleur courante : GL_FILL
Il possède deux faces, que l’on manipulera avec GL_FRONT, GL_BACK
et GL_FRONT_AND_BACK.
Présentation
32 / 40
Fonctions utiles
La fonction glColor*(.) prend en paramètre trois valeurs dans
l’intervalle [0, 1] ou [0, 255] (selon le type de données) pour définir la
couleur, et une quatrième (la valeur α, optionnelle) qui sera utilisée
dans la gestion de la transparence.
glColor3f( 1.0, 1.0, 1.0 ); // Blanc
glColor3f( 1.0, 0.0, 0.0 ); // Rouge
glColor3f( 0.0, 1.0, 0.0 ); // Vert
Présentation
33 / 40
Fonctions utiles
Projection orthogonale : glOrtho(.)
Transformation en perspective : glFrustum(.) et
gluPerspective(.)
Sélection de la matrice active : glMatrixMode(.)
Initialisation de la matrice active : glLoadIdentity()
Modification de la matrice active : glLoadMatrix*(.) et
glMultMatrix*(.)
Gestion de la pile de matrices : glPushMatrix() et
glPopMatrix()
Présentation
34 / 40
Fonctions utiles
Rotation : glRotate*(.)
Translation : glTranslate*(.)
Changement d’échelle : glScale*(.)
Position et orientation de la caméra : gluLookAt(.)
Gestion de l’illumination : glLight*(.) et glLightModel*(.)
Propriétés des surfaces : glMaterial*(.) et
glColorMaterial(.)
Présentation
35 / 40
Fonctions utiles
Sphère : glutSolidSphere(.) / glutWireSphere(.)
Cube : glutSolidCube(.) / glutWireCube(.)
Cône : glutSolidCone(.) / glutWireCone(.)
Tore : glutSolidTorus(.) / glutWireTorus(.)
Théière : glutSolidTeapot(.) / glutWireTeapot(.)
Présentation
36 / 40
Programme type OpenGL
Un programme est généralement composé de cinq parties :
1
Une fonction d’initialisation : void initialiser(.)
2
Une fonction d’affichage : void afficher(.)
3
Une fonction de fenêtrage : void refenetrer(.)
4
Une fonction de gestion du clavier : void clavier(.)
5
Une fonction de gestion de la souris : void souris(.)
6
Une fonction principale : int main(.)
Présentation
37 / 40
Programme type OpenGL
Dans la fonction main(.) du travail pratique #2, on retrouve
glutMouseFunc( MouseButton );
glutMotionFunc( MouseMove );
glutReshapeFunc( Reshape );
glutDisplayFunc( Display );
glutKeyboardFunc( keyboard );
Présentation
/*
/*
/*
/*
/*
Souris */
Souris */
Fenêtrage */
Affichage */
Clavier */
38 / 40
Références
1
Pipeline graphique
2
Introduction à OpenGL
3
Références
Présentation
39 / 40
Références
E. Angel and D. Shreiner.
Interactive Computer Graphics : a Top-Down Approach with Shader-Based OpenGL.
Addison-Wesley, 6th edition, 2012.
E. Lengyel.
Mathematics for 3D Game Programming and Computer Graphics.
Course Technology PTR, 3rd edition, 2012.
Présentation
40 / 40

Documents pareils