Introduction à OpenGL

Transcription

Introduction à OpenGL
Introduction à OpenGL
Pascal BOYER
[email protected]
lb
@ dh
f
O
OpenGL
GL
Introduction Generale OpenGL
Primitives
Modes de rendu
Éclairage
Mapping et Textures
OpenGL avancé
P
Presentation
t ti d
de O
OpenGL
GL
- Ce que OpenGL n’est pas
- Discussion autour d’OpenGL et de DirectX
- Frameworks 3D du marché
OpenGL et GLUT
O
OpenGL
GL and
d GLUT O
Overview
i
Qu’est-ce que OpenGL peut faire
Qu’estOpenGL et “windows managers”
Pourquoi Glut
Exemple de programme GLUT
Q ’ t
Qu’est-ce
O
OpenGL?
GL?
API de Rendu graphique
• Images composées à partir de formes dites
“primitives”
• Indépendant du système de fenêtrage
• Indépendant
I dé
d
d
de l’OS
A hit t
Architecture
O
OpenGL
GL
Polynomial
Evaluator
CPU
Display
Li t
List
Per Vertex
Operations &
Primitive
Assembly
Rasterization
Texture
Memory
Pixel
Operations
Per Fragment
O
Operations
Frame
Buffer
ff
O
OpenGL
GL comme moteur
t
d
de rendu
d
Primitives de géometrie
• points, lignes et polygones
Primitives d
d’image
image
• images et bitmaps
• pipeline
i li séparée
é é pour lles iimages ett lla géometrie
é
ti
•
Liées grâce au plaquage de texture
Le “Rendering” depend du contexte
• couleurs,, materiaux,, sources lumineuses,, etc.
API lié
APIs
liées
AGL, GLX, WGL
• Liaison entre OpenGL et le système
è
de fenêtrage
ê
GLU ((OpenGL
p
Utility
y Library)
y)
• partie de OpenGL
• NURBS,
NURBS tessellators
tessellators, quadric shapes
shapes, etc
etc.
GLUT (OpenGL Utility Toolkit)
• API de fenêtrage
ê
portable
• N’est pas officièlement une partie d’OpenGL
O
OpenGL
GL lles diffé
différentes
t APIs
API
application program
OpenGL Motif
widget or similar
GLX, AGL
or WGL
X, Win32, Mac O/S
GLUT
GLU
GL
software and/or hardware
E Amont
En
A
t
Fichiers d’en tête
• #include <GL/gl.h>
• #include <GL/glu.h>
• #include <GL/glut.h>
Libraries
Types Enumérés
• OpenGL
O
GL plusieurs
l i
types pour lla compatibilité
ibili é
– GLfloat, GLint, GLenum, etc.
GLUT Basics
B i
Structure d’une application de base
• Configurer and ouvrir une fenêtre
Initialisation de OpenGL state
• Enregistrement des méthodes Callback
• rendu
d
• redimensionnement
• entrées: Clavier,
Clavier souris,
souris etc.
etc
• Entrée dans la boucle de traitement
E
Example
l
void main(
( int argc
argc,
g , char** argv
g )
{
int mode = GLUT_RGB|GLUT_DOUBLE;
glutInit(&
glutInit
(&argc
(&argc,argv
argc
argc,argv);
argv);
argv);
glutInitDisplayMode(
glutInitDisplayMode
( mode );
glutInitWindowPosition(100,100);
glutInitWindowPosition
g
(100,100);
(
,
);
glutInitWindowSize(350,350);
glutInitWindowSize
(350,350);
glutCreateWindow(
glutCreateWindow
( « Test Open Gl » );
init();
init
();
glutDisplayFunc(
glutDisplayFunc
( display );
glutReshapeFunc(
glutReshapeFunc
( resize );
glutKeyboardFunc(
glutKeyboardFunc
( key );
( idle );
glutIdleFunc(
glutIdleFunc
glutMainLoop();
glutMainLoop
();
}
I iti li ti
Initialization
O
OpenGL
GL
Définition des paramêtres d’initialisation d’OpenGL
void init( void )
{
glClearColor( 0.0, 0.0, 0.0, 1.0 );
glClearDepth( 1.0 );
glEnable( GL_LIGHT0 );
glEnable( GL_LIGHTING );
g
glEnable( GL_DEPTH_TEST );
}
Méth d C
Méthodes
Callback
llb k GLUT
Code à appeler lors d’un déclenchement
evenementiel
ti l envoyé
é par l’API graphique
hi
• redimensionnement ou dessin de la fenêtre
• Entrée utilisateur
• Animation (idle)
(
)
Comment “Register” les méthodes callback
glutDisplayFunc( display );
glutDisplayFunc(
glutIdleFunc(
glutIdleFunc
( idle );
( keyboard );
glutKeyboardFunc(
glutKeyboardFunc
R d i Callback
Rendering
C llb k
Effectue les opérations de dessin vers le device
glutDisplayFunc(
glutDisplayFunc
l tDi l F
( display
di l
)
);
void display( void )
{
glClear(
glClear
( GL_COLOR_BUFFER_BIT );
glBegin(
glBegin
( GL_TRIANGLE_STRIP );
glVertex3fv( v[0] );
glVertex3fv(
lV t 3f ( v[1]
[1] )
);
glVertex3fv( v[2] );
glVertex3fv( v[3] );
glEnd();
glEnd
();
glutSwapBuffers();
glutSwapBuffers
();
}
Idl Callbacks
Idle
C llb k
Utilisation pour l’animation ou les mises à jour
glutIdleFunc( idle );
void idle( void )
{
t += dt;
; //
//angle
g
de rotation
glutPostRedisplay();
}
C llb k de
Callbacks
d d’entrée
d’ t é utilisateur
tili t
Gestion des saisies utilisateur
glutKeyboardFunc( keyboard );
void keyboard( unsigned char key, int x, int y )
{
switch( key ) {
case ‘q’ : case ‘Q’ :
exit( EXIT_SUCCESS
_
);
b
break;
k
case ‘r’ : case ‘R’ :
rotate = GL_TRUE;
glutPostRedisplay();
break;
}
}
Rendu Elementaire
R d Elementaire
Rendu
El
t i
“Primitives”
Gestion des “State” OpenGL
Buffers OpenGL
P i iti
Primitives
géometriques
é
t i
O
OpenGL
GL
Toutes les primitives sont définies par des
vertices
GL LINES
GL_LINES
GL_POINTS
GL_POLYGON
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_QUADS GL_QUAD_STRIP
GL TRIANGLE FAN
GL_TRIANGLE_FAN
E
Example
l
void drawRhombus( GLfloat color[] )
{
glBegin( GL_QUADS );
glColor3fv( color );
glVertex2f( 0.0, 0.0 );
glVertex2f( 1
1.0,
0 0
0.0
0 );
glVertex2f( 1.5, 1.118 );
glVertex2f( 0.5, 1.118 );
glEnd();
}
F
Formats
t d
des commandes
d O
OpenGL
GL
glVertex3fv( args
args…
… )
Nombre de
paramêtres
2 - (x,y)
3 - (x,y,z)
4 - (x,y,z,w)
(
)
Type de données
b
ub
s
us
i
ui
f
d
-
b t
byte
unsigned byte
short
unsigned
g
short
int
unsigned int
float
d bl
double
Vector
omettre “v” pour la
forme scalaire
glVertex2f( x, y )
S é ifi des
Spécifier
d P
Primitives
i iti
Une Primitive est définie par
glBegin( primType );
glEnd();
• primType determine comment les vertices sont agencés
GLfloat red
red, green
green, blue;
Glfloat coords[3];
glBegin( primType );
for ( i = 0; i < nVerts; ++i ) {
glColor3f( red, green, blue );
glVertex3fv( coords );
}
glEnd();
OpenGL
p
Modèles
de Couleur
Polynomial
Rasterization
DL
CPU
Vertex
Per Fragment
Texture
RGBA ou Color Index
Pixel
color index mode
Red Green
Blue
0
1
2
3

24
25
26
Display
123

219
74

RGBA mode
frame
Controle de l’apparence
pp
de
rendu
Du maillage
Wireframe
Au placage
De Texture
Et t de
Etat
d Machine
M hi O
OpenGL
GL
Tous les attributs de rendu sont encapsulés
d
dans
lles “Et
“Etats”
t ”O
OpenGL
GL
• Etat du rendu
• lissage
• eclairage
l i
• Placage de Texture
M i l ti d
Manipulation
des Et
Etats
t O
OpenGL
GL
L’apparence est contrôlée par l’état courant
for each ( primitive à rendre ) {
mise à jour du “state” OpenGL
render primitive
}
La manipulation des attributs de vertices est la
solution la plus courante pour gérer les états
glColor*() / glIndex
glColor*()
glIndex*()
*()
glNormal*()
glNormal
*()
glTexCoord*()
glTexCoord
g
*()
C t l de
Controle
d l’Et
l’Etatt courantt
Definition de l’Etat
glPointSize( size ); //taille du point en
mode GL_POINTS
glLineStipple( repeat
repeat,
, pattern ); //pattern
de la ligne
glShadeModel(
lSh d M d l( GL
GL_
_SMOOTH );
) //”fi
//”fini”
i” d
du rendu
d
Activation des fonctionalités
glEnable( GL_LIGHTING );
glDisable( GL_TEXTURE_2D
_
_
);
Transformations
T
Transformations
f
ti
dans
d
OpenGL
O
GL
Modèle
Vue
• Orientation de camera
• projection
Animation
Conversion à l’écran
l écran
C
Comparaison
i
à une C
Camera
La 3D c’est comme prendre une photo (des
tas de photos)
Volume de
visualisation
i
li ti
appareil
trépied
modèle
Parallèle avec les caméras et
les Transformations
Transformations de projection
• Ajustement
Aj t
t de
d lla llentille
till
Transformations de visualisation
• Le trepied définit le volume de visualisation et l’angle de
vue
Transformations
T
f
ti
d
de Modeling
M d li g
• Déplacement du modèle
Transformations de “Viewport“
• Élargissement ou réduction de l’angle de prise de vue
Système
y
de coordonnées et
Transformations
Etapes de la conrtruction d’une image
• Spécifier
S é ifi lla géometrie
é
i ((coordonnées
d
é “
“world”)
ld”)
• Spécifier la camera (coordonnées camera)
• projet (coordonnées de la fenêtre)
• CConversion viewport
p
((coordonnées écran))
Chaque étape utilise les transformations
Chaque transformation Equivaut à un changement
de coordonnées (frames)
T
Transformations
f
ti
Affine
Affi
Utilisation de transformations qui preservent
la géometrie
• lignes,
g ,p
polygones,
yg
,q
quadrilatères….
Affine = preservation des lignes
• Rotation, translation, “scaling”
• Projection
j
• Concatenation (composition)
C
Coordonnées
d
é Homogènes
H
è
chaque vertex est représenté comme un vecteur
x 
y
  
v
z 
 
w
w est généralement 1.0
Toutes les opérations sont des multiplications de matrices
Les Directions (segments orientés) peuvent être représentés avec w
= 0.0
T
Transformations
f
ti
3D
Un vertex est transformé via une matrice 4 x 4
• toute operation
p
affine est une multiplication
p
de matrice
• Toutes les matrices sont stockées avec une priorité sur la
colonne
• Les matrices sont toujours post-multipliées
• Le produit d’une matrice et un vecteur est M v
m 0 m 4 m8
m12
m1 m5
M=
m 2 m6
m9
m10
m13
m14
m3
m11
m15
m7
Défi i une T
Définir
Transformation
f
ti
Il existe deux moyens pour spécifier les
t
transformations
f
ti
• Définir une matrice (glLoadMatrix,
glMultMatrix
lM ltM t i )
• Définir une opération (glRotate,
glRotate, glOrtho)
glOrtho
Le développeur n’a pas à se souvenir des
matrices exactes
• Vérifier l’appendice du “Red Book” (Programming
Guide)
Programmation
g
des
Transformations
Définition de la vue, emplacement et
orientation
• Positionnement de l'oeil (caméra)
(
)
• Positionnement de la géométrie 3D
Gestion des matrices
• Les ppiles de matrices ((matrice stack))
Tansformations combinées (composites)
Pipeline
p
de
transformation
CPU
Polynomial
Vertex
Rasterization
DL
Per Fragment
Texture
Pixel
object
v
e
r
t
e
x
œil
clip
Device
fenêtre
Viewport
Transform
Modelview
Matrix
Projection
Matrix
Perspective
Division
M d l i
Modelview
P j ti
Projection
A
Autres
calculs
l l à ce niveau
i
• materiau  couleur
• Mode de lissage(flat)
• Mode de rendu polygone
• « culling » des faces
• clipping
Modelview



frame
O é ti
Opérations
d
de matrices
t i
Définition de la « Matrix stack » courante
glMatrixMode( GL_MODELVIEW
GL MODELVIEW or GL_PROJECTION
GL PROJECTION )
Opérations sur la « Matrix Stack »
glLoadIdentity()//raz
glPushMatrix() //empile
glPopMatrix()//dépile
Le Viewport indique la zone de dessin à utiliser dans la
fenêtre
• Généralement le même que la taille de la fenêtre
• L' « aspect ratio » doit être le même que celui de la
transformation de projection ou l'image sera déformée
glViewport( x, y, width, height )
Transformation de Projection
Zone de visualisation “frustum »
Projection Perspective (oeil => fovy =45)
gluPerspective( fovy, aspect, zNear, zFar )
glFrustum( left, right, bottom, top, zNear, zFar )
Projection Orthogonale (//)
glOrtho( left, right, bottom, top, zNear, zFar )
gluOrtho2D(
l O h 2 ( left,
l f
right,
i h
b
bottom,
top )
• Effectue un appel à glOrtho avec arguments “z”
proche de 0
Application des transforamtions de
projection
Utilisation habituelle (pour une projection
orthogonale)
th
l )
glMatrixMode(
glMatrixMode
( GL_PROJECTION );
glLoadIdentity();
glLoadIdentity
();
glOrtho(
glOrtho
( left
left,
, right, bottom
bottom,
, top, zNear
zNear,
, zFar );
T
Transformations
f
ti
de
d point
i td
de vue
Position de la camera sur la scene
• Positioner le trepied
Pour « survoler » une scene
• Changer le point de vue et redessiner
gluLookAt(
gluLookAt
( eyex, eyey, eyez,
aimx, aimy, aimz,
upx, upy, upz )
• Le « up vector » definit le “tilt” de la caméra
• Attention aux positionnements incorrects (caméra
renversée….)
tripod
T
Transformations
f
ti
d
de « Modeling
M d li »
Déplacer l'objet
glTranslate{fd}( x,
x y,
y z )
Pivoter autour d'un axe
glRotate{fd}( angle, x, y, z )
• angle
l estt exprimé
i é en d
degrés
é
Alterer les p
proportions
p
(stretch
(
or shrink)) ou
retourner l'objet
glScale{fd}( x, y, z )
Connection: visualisation et
« Modeling »
Déplacer la caméra équivaut à déplacer tous
les objets et garder une caméra
stationnaire
Une transformation de visualisation équivaut
à plusieurs de « modeling »
gluLookAt() appelle des commandes de
transformation OpenGL en interne
Le p
projections
j
sont « left
handed »
transformations de Projection
(gluPerspective, glOrtho) sont « left
handled »
• Penser aux zones de clipping de la vue
T t le
Tout
l reste
t estt « right
i ht handed
h d d»
y
y
z+
+
left handed
right handed
x
z+
x
Utili ti courantes
Utilisation
t
3 examples de méthodes resize()
• Modifie la projection et la vue
• Géneralement appelée sur un redimensionnement
de la fenêtre
La méthode callback est définie par
glutReshapeFunc()
resize():
() Perspective
p
&
LookAt
void resize( int w, int h )
{
glViewport(
glViewport
( 0, 0, (
(GLsizei
GLsizei)
) w, (
(GLsizei
GLsizei)
) h );
glMatrixMode(
glMatrixMode
( GL_PROJECTION );
glLoadIdentity();
glLoadIdentity
();
gluPerspective(
gluPerspective
( 65.0, ((
((GLdouble
GLdouble)
) w) /
((GLdouble
((
GLdouble)
) h), 1.0, 100.0 );
glMatrixMode(
glMatrixMode
( GL
GL_MODELVIEW
MODELVIEW );
glLoadIdentity();
glLoadIdentity
();
gluLookAt(
gluLookAt
( 0.0, 0.0, 5.0,
0 0 0
0.0,
0.0,
0 0
0.0,
0
0.0, 1.0, 0.0 );
}
resize():
() Perspective
p
&
Translation
Même effet que le LookAt
void
id resize(
i ( i
int w, i
int h )
{
glViewport( 0, 0, (GLsizei) w, (GLsizei) h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 65.0, (GLdouble) w/h,
1.0, 100.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0, 0.0, -5.0 );
}
resize():
i () Ortho
O th ((partt 1)
void resize( int width, int height )
{
GLd bl aspect
GLdouble
t = (GLdouble)
(GLd bl ) width
idth / h
height;
i ht
GLdouble left = -2.5, right = 2.5;
GLdouble bottom = -2.5,
, top
p = 2.5;
;
glViewport( 0, 0, (GLsizei) w, (GLsizei) h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
… suite sur le slide suivant …
resize():
i (): Ortho (part 2)
if ( aspect < 1.0 ) {
left /= aspect;
right /=
/ aspect;
} else {
bottom *= aspect;
top *= aspect;
}
glOrtho(
l
h ( l
left,
f
right,
i h
b
bottom, top, near, f
far )
);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
Gerer les transformations
cumulées
Problème 1: object hierarchiques
• La position de l'objet courant dépend du précédent
• La main et le bras sont dépendants l'un
l un de l'autre
l autre
Solution 1: déplacer le système de
coordonnées local
Les transformation « modeling
g » déplacent
p
le système
y
de coordonnées
• OpenGL post-multiplie
post multiplie les matrices
Gerer les transformations
cumulées
Problème 2: les objets se déplacent par rapport au
« World »
• Mes object tournent autour d'un axe faussé donc on veut les
fixer autour de leur centre propre
Solution 2: fixer le système de coordonnées
• les transformations agissent sur l’objet
l objet autour d’un
d un système
de coordonnées fixes
• pre-multiplie les matrices matrices
• OpenGL post-multiplie les matrices
• On doit pprendre les coordonnées dans l’ordre inverse ppour
obtenir l’effet désiré
Récuperer
p
une coordonnée
écran depuis la projection
De l’écran vers le world
glGetIntegerv( GL_VIEWPORT, GLint viewport[4] )
glGetDoublev( GL_MODELVIEW_MATRIX, GLdouble
mvmatrix[16] )
glGetDoublev( GL_PROJECTION_MATRIX,
GLdouble projmatrix[16] )
gluUnProject( GLdouble winx
winx, winy
winy, winz
winz,
mvmatrix[16], projmatrix[16],
GLint viewport[4],
GLdouble *objx
*objx, *objy
*objy, *objz )
gluProject va du world vers l’écran
Animation et Depth Buffering
A i ti and
Animation
dD
Depth
th B
Buffering
ff i
Gestion du double buffering
Masquage de zone est test de profondeur
Double
Buffering
Polynomial
CPU
Vertex
Rasterization
DL
Texture
Pixel
Front
Buffer
Back
Buffer
Swap
Buffer
Display
Per Fragment
frame
Utili ti du
Utilisation
d d
double
bl b
buffering
ff i
Activation à la création du device
glutInitDisplayMode
glutInitDisplayMode(
l
i i l
d ( G
GLUT_RGB
G | G
GLUT_DOUBLE
O
)
);
Nettoyage du « color buffer »
glClear(
glClear
( GL_COLOR_BUFFER_BIT );
Rendu de la scene
Récupération du back buffer
glutSwapBuffers();
Répeter les points 2 et 4 pour l’animation
Depth
p Buffering
g et supression
p
de
géométrie cachée
Color
Buffer
Depth
Buffer
Di l
Display
D th Buffer
Depth
B ff ett Open
O
GL
créer le Depth Buffering
glutInitDisplayMode
glutInitDisplayMode(
l tI itDi l M d ( GLUT_RGB
GLUT RGB |
GLUT_DOUBLE | GLUT_DEPTH );
A ti ti d
Activation
du ttestt d
de profondeur
f d
glEnable(
glEnable
( GL_DEPTH_TEST );
Nettoyage des 2 buffers
glClear(
glClear
g
( GL_COLOR_BUFFER_BIT
_
_
_
|
GL_DEPTH_BUFFER_BIT );
Rendu de la scene
Swap du back buffer vers le front
Et on ét
étoffe
ff
void main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGB |
GLUT_DOUBLE
GLUT DOUBLE | GLUT
GLUT_DEPTH
DEPTH );
glutCreateWindow( “Tetrahedron” );
init();
glutIdleFunc( idle );
glutDisplayFunc(
g
p y
display
p y );
glutMainLoop();
}
Et on etoffe
t ff ((encore.))
void init( void )
{
glClearColor( 0.0, 0.0, 1.0, 1.0 );
}
void
id idl
idle(
( void
id )
{
glutPostRedisplay();
g
p y();
}
Et on etoffe
t ff (t
(toujours…)
j
)
void drawScene( void )
{
GLfloat vertices[] = { … };
GLfloat colors[] = { … };
glClear( GL
GL_COLOR_BUFFER_BIT
COLOR BUFFER BIT |
GL_DEPTH_BUFFER_BIT );
glBegin( GL_TRIANGLE_STRIP );
/* calls to glColor*() and glVertex*() */
glEnd();
glutSwapBuffers();
}
Eclairage
P i i de
Principe
d l’é
l’éclairage
l i
L ’éclairage simule le comportement des objets vis
vis-à-vis
i d’une
d’
source lumineuse
l i
en ffonction
ti
• Du materiau de l’objet
• De la position et couleur de la source
• Des pparamêtres « ambient »
• Lumière ambiante
• Éclairage
g « two sided »
• Disponible pour les 2 modes de couleur
C
Comment
t Opengl
O
l gère
è la
l llumière
iè
Eclairage phong
• Géré par vertex
La lumière dépend de :
• Les propriétés du matériau
• La lumière
• Le « Lightning model »
Polynomial
L normales
Les
l
CPU
Vertex
Rasterization
DL
Per Fragment
Texture
Pixel
Une normale définit comment la surface
reflète la lumière
glNormal3f( x, y, z )
• La normale est utilisée pour définir la couleur du vertice
• Utilisation de vecteurs normés
• Le Scale agit sur la taille de la normale
glEnable( GL_NORMALIZE
GL NORMALIZE )
ou
glEnable( GL_RESCALE_NORMAL )
frame
P
Propriétés
iété d
du materiau
t i
Définit les propriétés de surface de la primitive
glMaterialfv( face, property, value );
GL_DIFFUSE
Base color
GL_SPECULAR
Highlight Color
GL_AMBIENT
Low-light
g Color
GL_EMISSION
Glow Color
GL SHININESS
GL_SHININESS
Surface Smoothness
• On peut définir un matériau par côté de la face
P
Propriétés
iété d
de lla llumière
iè
glLightfv( light, property, value );
• light spécifie
é ifi quelle
ll est lla lumière
l iè défi
définie
i
• Gestion de plusieurs sources, la première étant
GL_LIGHT0
glGetIntegerv( GL_MAX_LIGHTS, &n );
• propriétés
• couleur
couleu
• position et type
• atténuation
T
Type
de
d propriétés
iété
• GL_AMBIENT
• GL_DIFFUSE
GL DIFFUSE
• GL_SPECULAR
T
Types
de
d lumières
l iè
OpenGL supporte 2 types de sources
• Locales (Point)
• Infinies (Directionnelles)
Controlées par les coordonnées w
x
w= 0
lumière infinie dirigée selon
w0
lumière locale positionné e à  xw
y
yw
z
zw s
A ti ti d’
Activation
d’une source
On branche la source
glEnable( GL_LIGHT
GL_LIGHTn
n );
Et on allume
ll
glEnable( GL_LIGHTING
g
_
);
G ti de
Gestion
d lla source d
de llumière
iè
La matrice ModelView affecte la position de
la lumière
• Plusieurs effets sont basés dessus
• Coordonnées de camera
• Coordonnées World
• Coordonnées du modèle
• Utilisation du « pushing » et « poping » de matrices
pour affecter la position de lumière seulement
F
Fonction
ti d
de lluminaires
i i
avancées
é
Spotlights
•GL_SPOT_DIRECTION
•GL_SPOT_CUTOFF
•GL_SPOT_EXPONENT
F
Fonctions
ti
avancées
é suite
it
Attenuation de la source
• Diminue l’intensité avec la distance
•GL_CONSTANT_ATTENUATION
GL CONSTANT ATTENUATION
•GL_LINEAR_ATTENUATION
•GL_QUADRATIC_ATTENUATION
GL QUADRATIC ATTENUATION
Propriétés
p
du gestionnaire
g
de
lumières
glLightModelfv( property, value );
Activation du mode de lumière sur les 2 faces
GL_LIGHT_MODEL_TWO_SIDE
Couleur
C l
globale
l b l de
d l’ambient
l’ bi t
GL_LIGHT_MODEL_AMBIENT
Local viewer mode
GL_LIGHT_MODEL_LOCAL_VIEWER
Couleur specular séparée
GL_LIGHT_MODEL_COLOR_CONTROL
Ti sur lles llumières
Tips
iè
L’éclairage est calculé par vertex
• La tesselation augmente la qualité de rendu
• Meilleur résultat mais moins bonne performances
Une lumière infinie est plus rapide pour le
rendu
• La determination de la luminosité par vertex est
plus simple
Les images et la rasterisation
Pi l b
Pixel-based
d primitives
i iti
Bitmaps
• Tableau 2D de bit de masquage pour les pixels
• La couleur du pixel mis à jour dépend de la couleur courante
( lC l )
(glColor)
Images
• Tableau 2D de l’ensemble des informations de couleur
• Information complète pour chaque pixel
OpenGL ne gère pas le chargement des images
Polynomial
Pi l Pi
Pixel
Pipeline
li
Vertex
Rasterization
DL
CPU
Per Fragment
frame
Texture
Pixel
Stockage de pixel programmable et
operations de transfert
glBitmap(), glDrawPixels()
CPU
Pixell
Pi
Storage
Modes
Pixel-Transfer
Pi
lT
f
Operations
(and Pixel Map)
Rasterization
R
t i ti
(including
Pixel Zoom)
Texture
Memory
Per Fragment
Operations
glCopyTex*Image();
glReadPixels(), glCopyPixels()
Frame
Buffer
Positionnement de primitives
p
image
glRasterPos3f( x, y, z )
• Les positions de « rasterisation » sont affectées par
les transformations comme les vertices
• N’est pas effectuée quand
la Raster position est hors
de la zone de clipping
Raster Position
R d i Bitmaps
Rendering
Bit
glBitmap( width, height, xorig, yorig, xmove,
ymove, bitmap )
height
• Rend le bitmap dans la couleur
courante à x  xorig   y  yorig 
Avance la position de
yorig
après
le
rendu
xmove ymove
width
xorig
xmove
Rendu des Polices avec les
Bitmaps
OpenGL utilise les bitmaps pour le rendu des
polices
• Chaque
q caractère est contenu dans une « display
p y
list » qui contient un bitmap
• Méthodes spécifiques du « window manager » pour
acceder aux polices système
• glXUseXFont()
• wglUseFontBitmaps()
• glutBitmapCharacter() / glutBitmapString()
F
Format
td
des iimages
glDrawPixels( width, height, format, type,
pixels )
• Rendu de l’image par le bord
bas droit à la « raster position »
• Nombreux formats types de
données pour spécifier le stockage
en mémoire
• On
O améliore
éli
les
l performances
f
en utilisant
tili t d
des ttypes
et formats en corrélation avec le matériel
L t
Lecture
d
des pixels
i l
glReadPixels( x,
x y
y, width
width, height
height, format
format,
type, pixels )
• lit les pixels contenus dans le framebuffer à la
position spécifiée par (x,y)
• Les pixels contenus dans le framebuffer sont
automatiquement convertis dans le type demandé
Copie
C i de
d pixels
i l dans
d
le
l fframebuffer
b ff
glCopyPixels( x, y, width, height, type )
• Les pixels sont copiés du framebuffer directement
vers la « raster position »
Pi l Z
Pixel
Zoom
glPixelZoom( x, y )
• Étend, réduit ou « reflète » les pixels
autour de la « raster position » courante
Raster
Position
glPixelZoom(1.0,
g
(
, -1.0);
)
Texture Mapping
Texture
Mapping
Poly.
CPU
Per
Vertex
Raster
DL
Frag
FB
Texture
Pixel
Applique une image 1D
1D, 2D ou 3D à une
primitive de géométrie
Utilisations
U ili i
d
des textures
• Simulation de structure du matériau
• Reduction de la complexité des objets
• Reflections
R fl i
(
(avec
lle stencil
il b
buffer)
ff )
Texture Mapping
geometrie
y
z
x
image
écran
Texture Mapping
pp g et le Pipeline
p
OpenGL
Les images et la géometrie sont gérés indépendament et
sont assemblées par la « rasterisation »
• Les textures « complexes » n’affectent pas la
complexité du modèle
vertices
geometry pipeline
rasterizer
image
pixel pipeline
Pl
Placage
d
de ttexture
t
I
Trois étapes
Spécifier une texture
•
•
•
Lire ou génerer une image
Assigner la texture
Activer la texture
Attribuer des coordonnées de textures aux vertices
Spécifier les paramètres de la texture
•
wrapping,
pp g, filtering
g
Pl
Placage
de
d ttexture
t
II
• Specifier les images aux objets texture
• Définir le filtre
• Définir la fonction de texture
• Définir le « wrap mode »
• « bind » de l’objet
l objet texture
• Activation du texturing
• Fournir les coordonnées de textures par vertex
Elles peuvent également être générées
Obj t texture
Objet
t t
Les « emplacements » des textures sont générés
par la
l carte
t
• Un identifiant par objet texture
• Peut
P
être
ê
partagé
é par plusieurs
l i
d i
devices
Generation de la texture
glGenTextures(
glGenTextures
(
n, *texIds
L Ids
Les
Id générés
é é é ne sontt pas contigus
ti
=> on p
passe par
p un tableau
);
Obj t ttexture
Objet
t
((suite.)
it )
Alimentation de l’objet avec des données et des
paramêtre
êt
glBindTexture(
target, id
);
Ou la même avant d’afficher une primitive
glBindTexture(
t
target,
t id
);
Specifier
p
une image
Poly.
CPU
Per
Vertex
Raster
DL
Frag
FB
Texture
Pixel
Definit une image pour la
l texture à partir
d’un tableau de Textels en mémoire
glTexImage2D( target
target,
, level
level,
, components,
w, h, border, format, type, *texels
*texels );
• Les dimensions de l’image doivent être
puissance de 2
La couleur de Texels sont gérées pas le
Pipeline
l
Pixell
C
Convertir
ti une iimage d
de ttexture
t
Si les dimensions ne sont pas multiples de 2
gluScaleImage(
gluScaleImage
( format, w_in
w_in,
, h_in
h_in,
,
type_in, *
type_in,
*data_in
data_in,
, w_out
w_out,
, h_out
h_out,
,
t
type_out,
type_out
t, *data_out
*data_out
d t
t );
)
• *_in pour l’image source
• *_out pour l’image destination
L’image est interpolée et filtrée lors du Scaling
Definir une texture :
autre méthodes
Utliser le frame buffer comme source pour la texture
• Utilise
Utili lle b
buffer
ff courantt pour source
glCopyTexImage1D(...)
glCopyTexImage2D(...)
l
2 (
)
Modification d’une partie de l’image existante
glTexSubImage1D(...)
glTexSubImage2D(...)
glTexSubImage3D(...)
Et faire les 2 avec glCopyTexSubImage2D(...), etc.
Placage
g de
texture
Poly.
CPU
Per
Vertex
Raster
DL
Frag
FB
Texture
Pixel
Basé sur les coordonnées paramétriques passées à
chaque
h
vertex
t par glTexCoord*()
lT C
d*()
t
0, 1
Espace texture
1, 1
(s, t) = (0.2, 0.8)
A
a
b
0, 0
Object Space
(0 4 00.2)
(0.4,
2)
c
B
1, 0
s
C
(0 8 00.4)
(0.8,
4)
Génération des coordonnées de
texture
Génération automatique des coordonnées de
glTexGen{ifd}[v]()
lT G {ifd}[ ]()
Définition de la surface
• Génère les coordonnées de texture de la surface en fonction
de la distance par rapport à un plan
Mode
d de
d génération
• GL_OBJECT_LINEAR
• GL_EYE_LINEAR
• GL_SPHERE_MAP
_
_
Ax + By + Cz + D = 0
M d d’application
Modes
d’
li ti de
d lla ttexture
t
Modes de filtrage
• minification ou magnification
• mipmaping
Modes Wrap
• clamping ou repeating
Texture Functions
• Mode de mélange des couleurs de texture et de l’objet
• blend, modulate ou emplacement de texels
M d de
Mode
d filtrage
filt
Example:
glTexParameteri(
lT P
t i( target,
t
t t
type, mode
d );
)
Texture
Polygone
Magnification
Texture
Polygone
Minification
T t
Textures
ett Mi
MipMapping
M
i
Le mipmap est utilisé afin de donner une liste de
résolutions différentes en fonction du point de vue
(effet bouillie de pixels lié à la perspective)
Déclaration du niveau de mipmapping lors de la création
de la texture (jouer sur le level)
glTexImage*D( GL_TEXTURE_*D, level, … )
Géneration mipmap par le GLU builder
gluBuild*DMipmaps( … )
W
Wrapping
i M
Mode
d
Exemple:
glTexParameteri( GL_TEXTURE_2D,
glTexParameteri(
GL_TEXTURE_WRAP_S, GL_CLAMP )
glTexParameteri( GL_TEXTURE_2D,
glTexParameteri(
GL_TEXTURE_WRAP_T, GL_REPEAT )
t
s
t t
texture
GL_REPEAT
wrapping
GL_CLAMP
wrapping
F
Fonction
ti d
de ttextures
t
Contrôle comment les textures sont appliquées
glTexEnv{fi}[v]( GL_TEXTURE_ENV, prop, param )
GL_TEXTURE_ENV_MODE modes
• GL_MODULATE
• GL_BLEND
• GL_REPLACE
Définition
Défi iti d
de lla couleur
l
d
de Bl
Blend
d avec
GL_TEXTURE_ENV_COLOR
C
Correction
ti d
de perspective
ti
Les coordonnées de texture et l’interpolation de
couleur est faite soit par
• Système linéraire en fonction de la vue
• Soit en utilisant la perspective
Utile pour les polygones “on edge”
glHint( GL_PERSPECTIVE_CORRECTION_HINT, hint )
hint peut être
• GL_DONT_CARE
• GL_NICEST
• GL_FASTEST
OpenGL Avancé
Mode Immédiat versus Mode
« Display List »
Mode « Immédiat »
• Les données sont envoyées au vertex pipeline et rendues au fur et
à mesure
• Le Pipeline nn’aa aucune mémoire des entités déssinées
Mode « Display List »
• Les primitives sont placées dans des liste dd’affichage
affichage
• Une display list est compilée et stockée sur le serveur graphique
• Peuvent être redessinées en utilisant un mode OpenGL différent
• Peuvent être partagées par plusieurs « contextes graphiques
OpenGL
p
»
Mode Immédiat versus Mode
« Display List »
Immediate Mode
Polynomial
Evaluator
CPU
Display
List
Per Vertex
Operations &
Primitive
Assembly
Rasterization
Display
p y Listed
Pixel
Operations
Texture
Memor
y
Per Fragment
Operations
Frame
Buffer
Display List
Poly.
CPU
Per
Vertex
Raster
DL
Frag
FB
Texture
Pixel
Création d’une Liste
GLuint
i
id
id;
void init
init(
( void )
{
id = glGenLists
glGenLists(
( 1 ); //indices générés contigus
glNewList(
glNewList
( id, GL_COMPILE );
/* other OpenGL routines */
glEndList
g
glEndList();
d st();
st();
}
Appel de la Liste ainsi créée
void display( void )
{
glCallList(
glCallList
( id );
}
Di l Lists
Display
Li t
Il n’est pas possible de stocker toutes les
fonctions OpenGl dans la display List
Les changements d’état persistent même après la
fin d
d’une
une Display List
Une Display List peut en cacher une autre
Les
L Di
Display
l liste,
li t bi
bien que non édit
éditables
bl peuventt
être « trompées »
• Créer
C é une li
liste
t (A) quii appelle
ll d’
d’autre
t li
listes
t (B
(B, C
C, and
d D)
• Supprimer et remplacer B, C, and D, selon le besoin
Di l Li t ett lla hié
DisplayList
hiérarchie
hi
Sur la base d’un modèle voiture
• Créer une display list pour le chassis
• Créer une display list pour une roue
glNewList( CAR, GL_COMPILE );
glCallList( CHASSIS );
glTranslatef( … );
glCallList( WHEEL );
glTranslatef( … );
glCallList(
lC llLi t( WHEEL )
);
…
glEndList();
Bl di
Blending
Permet de simuler des effets en cumulant
des
d informations
i f
ti
déjà présentes
é
t dans
d
le
l «
Color Buffer » avec des information à
afficher
Souvent utilisé avec la composante Alpha et
en particulier dans le cadre de la
transparence des primitives
glEnable( GL_BLEND )
D fi iti du
Definition
d Bl
Blending
di
Le Blending permet d’ecrire dans le « Color
Buffer » sans remplacer la donnée existante
• La source est la donnée à afficher
• La destination est la donnée déjà présente dans le buffer.
Le Blending de fait se lon une formule précise
• srcColor*srcFactor + destColor*destFactor
F t
Facteurs
d
de Bl
Blending
di
glBlendFunc( srcFactor, destFactor)
destFactor)
Permet de définir les facteurs agissant sur la source
et la destination lors du blending
• Certains paramètres ne sont applicables qu’à la source ou à la
destination
Les 2 : GL_ZERO, GL_ONE, GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA…
Source
S
: GL
GL_DST_COLOR,
DST COLOR GL_ONE_MINUS_DST_COLOR,
GL ONE MINUS DST COLOR
GL_SRC_ALPHA_SATURATE
Destination : GL
GL_SRC_COLOR,
SRC COLOR, GL
GL_ONE_MINUS_SRC_COLOR
ONE MINUS SRC COLOR
Blending et Transparence
Le blending
bl d
est utilisé
l é fréquemment
f é
pour simuler
l des
d objets
b
transparents. glBlendFunc( GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA)
GL_ONE_MINUS_SRC_ALPHA
)
En cas de présence de plusieurs objets transparents dans
peuvent se cacher mutuellement à cause du
une scène, il p
t td
test
de D
Depth
th Buffering.
B ff i
La technique
q consiste à :
• Activer le Depth test
• Dessiner les objets opaque
• Passer le Depth buffer en lecture seule
- glDepthMask(false); //evite la modification du zbuffer
• Dessiner les objets « transparents »
• Restaurer l’état du Depth Buffer glDepthMask(true);
C t ôl du
Contrôle
d St
Stencil
il B
Buffer
ff
glStencilFunc( func, ref, mask )
• Compare les valeurs du buffer avec ref en fonction de
func
• Appliquéé uniquement aux valeurs mask qui sont sur 1
• func est une des fonction de comparaison standard
glStencilOp( fail, zfail, zpass )
• Autorise les modifications du Stencil Buffer en
fonction du résultat : GL_KEEP, GL_INCR
C é ti d
Création
du masque
glInitDisplayMode( …|GLUT_STENCIL|… );
glEnable( GL
GL_STENCIL_TEST
STENCIL TEST )
);
glClearStencil( 0x0 );
glStencilFunc( GL_ALWAYS, 0x1, 0x1 );
glStencilOp( GL_REPLACE,
GL REPLACE GL
GL_REPLACE,
REPLACE
GL_REPLACE );
(dessin du masque)
Utili ti d
Utilisation
du stencil
t
il b
buffer
ff
Affiche les objets dont le stencil = 1
glStencilFunc( GL_EQUAL, 0x1, 0x1 )
Affiche les objets dont le stencil != 1
glStencilFunc( GL_NOTEQUAL, 0x1, 0x1 );
glStencilOp(
l
il ( GL_KEEP, GL_KEEP, GL_KEEP );
)
M d Selection
Mode
S l ti
• Methode pour determiner quelles
primitives
i iti
sontt à l’i
l’intérieur
té i
d
du volume
l
d
de
visualisation
• Nécessité de définir un buffer en vue de
récuperer les résultats du picking
• glSelectBuffer( size, buffer )
• Changer
Ch g le
l mode
d de
d Rendu
R d en « Select
S l t»
• glRenderMode( GL_SELECT )
M d Selection
Mode
S l ti
• Pour pouvoir identifier une primitive il faut la
nommer
• Les “noms” sont des entiers, pas des chaines
Les noms sont basés sur un système de pile
• Définition de hiérarchies de nom ppar empilement
p
Méthodes de nommage
glInitNames()
glInitNames
() //activation de la pile de noms
glPushName(
glPushName
( name ) / glPopName
glPopName(
( name )
glLoadName(
glLoadName
g
( name )//
)//remplace
p
le nom en haut de la p
pile
Pi ki
Picking
Le Picking est une type particulier de sélection
Etapes de programmations
• Réduire « l’affichage » à une zone réduite autour de la zone
de click
Utilisation de gluPickMatrix() sur la matrice de
projections
• Renseigner le mode de sélection, re-rendre la scene
• Les primitives dessinées près dur curseurs déclenchent le
« hit
h »
• Sortir de la sélection et analyser les résultats
Example de Picking
• glutMouseFunc( pickMe );
• void pickMe( int button, int state, int x, int y
)
{
•
GL i t selectBuffer[256];
GLuint
l tB ff [256]
•
GLint hits;
•
GLint myViewport[4];
•
if (button != GLUT_LEFT_BUTTON
GLUT LEFT BUTTON ||
•
state != GLUT_DOWN) return;
•
glGetIntegerv( GL_VIEWPORT, myViewport );
glSelectBuffer( 256
256, selectBuffer );
•
(void) glRenderMode( GL_SELECT );
•
GlInitNames();
E
Example
l de
d Picking
Pi ki ((suite…)
it )
•
•
•
•
•
glMatrixMode(
lM t i M d ( GL_PROJECTION
GL PROJECTION )
);
glPushMatrix();
glLoadIdentity();
g
y();
gluPickMatrix( (GLdouble) x, (GLdouble)
(myViewport[3](myViewport[3]
-y), 5.0, 5.0, myViewport
);
• /*
*/
gluPerspective or glOrtho or other projection
•
glPushName( 1 );
• /*
draw something */
•
glLoadName( 2 );
g
• /*
draw something else … continue …
*/
E ample de Picking (fin!)
Example
•
glMatrixMode( GL_PROJECTION );
•
glPopMatrix();
g op at
();
•
hits = glRenderMode( GL_RENDER );
• /*
process selectBuffer */
• }
O ti i ti d
Optimisation
du Pi
Picking
ki
• Pour un Picking plus efficace
•N
N’effectuer
effectuer le rendu que de ce qu’on
qu on peut « Picker »
• Utilisation de primitives simples (boundbox, boundsheres,
rectangles pour du texte)
• Si plusieurs primitives sont dessinées dans la zone de
picking, il est difficile de trier sur le z-order
http://www.developpez.net/forums/d666331/applications/developpementhttp://www.developpez.net/forums/d666331/applications/developpement2d2d
-3d
3d-jeux/contribuez/source
jeux/contribuez/source-opengl
opengl-picking/