| DEFINITION INTRODUCTION
Fonctionnalités
Syntaxe
Variables d'état
Bibliothéques
L'AUXILIARY
LIBRARY
L'UTILITY
TOOLKIT
INSTRUCTIONS
DE BASE
Effacement
de la fenêtre
Couleur de tracé
Terminaison
du tracé
Les parties cachées
Sommets, lignes
et polygones
EXEMPLES GLUt
VISUALISATION
EN OPENGL
Le processus
de visualisation
Les transformations
Exemples
LES LISTES
D'AFFICHAGE
Définition
Commandes
MODES DE
LISSAGE
LES MATERIAUX
Configuration
Exemple
LES LUMIERES
Configuration
Modèle
d'illumination
Exemple
LES BITMAPS
Introduction
Commandes
Exemple
LE PLACAGE
DE TEXTURE
Introduction
Commandes
LES
COURBES
ET SURFACES
LISSEES
Introduction
Commandes
Les NURBS
LA SELECTION
D'OBJETS
Introduction
Mode opératoire
Commandes
RETOUR
Dernière modification
11/07/01 18:13:24 |
|
Visualisation en OpenGL
Processus de
visualisation
Quatre transformations successives
pour obtenir une image:
(1) Transformation de modélisation
(Model)
Permet de créer la scène à afficher
par création, placement et orientation des objets qui la composent.
(2) Transformation de visualisation
(View)
Permet de fixer la position et
l'orientation de la caméra de visualisation.
(3) Transformation de projection
(Projection)
Permet de fixer les caractéristiques
optiques de la caméra de visualisation (focale, mode de projection,...).
(4) Transformation d'affichage
(Viewport)
Permet de fixer la taille et la
position de l'image sur l'écran.
Les transformations de visualisation
et de modélisation n'en forment qu'une pour OpenGL (transformation modelview). Cette
transformation fait partie de l'environnement OpenGL.
La transformation de projection existe
en tant que telle dans OpenGL, et fait elle aussi partie de l'environnement OpenGL.
Chacune de ces transformations peut
être modifiée indépendamment de l'autre ce qui permet d'obtenir une indépendance des
scènes modélisées vis à vis des caractéristiques de la "caméra" de
visualisation.
Exemple
#include "windows.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <stdio.h>
#include <stdlib.h>
static float rotx = 0.0f ;
static float roty = 0.0f ;
static float rotz = 0.0f ;
void myinit(void) {
glShadeModel(GL_FLAT);
}
void CALLBACK myReshape(int w, int h) {
glViewport(0,0,w,h); /*(4)*/
glMatrixMode(GL_PROJECTION); /*(3)*/
glLoadIdentity(); /*(3)*/
glFrustum(-1.,1.,
-1.,1.,
1.5,20.); /*(3)*/
glMatrixMode(GL_MODELVIEW); /*(2-1)*/
}
void CALLBACK display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity(); /*(2)*/
glTranslatef(0.0,0.0,-5.0); /*(2)*/
glRotatef(rotx,1.0f,0.0f,0.0f); /*(2)*/
glRotatef(roty,0.0f,1.0f,0.0f); /*(2)*/
glRotatef(rotz,0.0f,0.0f,1.0f); /*(2)*/
glScalef(1.0,2.0,3.0); /*(1)*/
auxWireCube(1.0); /*(1)*/
glFlush();
}
void CALLBACK auxX(void) {
rotx += 2 ;
}
void CALLBACK auxx(void) {
rotx -= 2 ;
}
void CALLBACK auxY(void) {
roty += 2 ;
}
void CALLBACK auxy(void) {
roty -= 2 ;
}
void CALLBACK auxZ(void) {
rotz += 2 ;
}
void CALLBACK auxz(void) {
rotz -= 2 ;
}
void main() {
auxInitDisplayMode(AUX_SINGLE|AUX_RGB);
auxInitPosition(0,0,200,200);
auxInitWindow("Visualisation");
myinit();
auxKeyFunc(AUX_X,auxX) ;
auxKeyFunc(AUX_x,auxx) ;
auxKeyFunc(AUX_Y,auxY) ;
auxKeyFunc(AUX_y,auxy) ;
auxKeyFunc(AUX_Z,auxZ) ;
auxKeyFunc(AUX_z,auxz) ;
auxReshapeFunc(myReshape);
auxMainLoop(display);
}

Transformations
Transformations d'utilité générale
mode:
matrice sur laquelle les transformations à venir vont être opérées (GL_MODELVIEW
ou GL_PROJECTION).
glMatrixMode est généralement appelé
une fois sur chacun de ces paramètres de manière à calculer les matrices modelview et
projection. Ces appels sont habituellement réalisés au sein de la fonction reshape si la
librairie Aux est utilisée.
Affecte
la matrice courante avec la matrice identité.
Affecte
la matrice courante avec la matrice m (16 valeurs).
Multiplie
la matrice courante par la matrice m (16 valeurs).
Multiplie
la matrice courante par la matrice de translation (x,y,z).
- void glRotate{f d}(TYPE
a,TYPE dx,TYPE dy,TYPE dz);
Multiplie
la matrice courante par la matrice de rotation d'angle a autour de l'axe (dx,dy,dz).
- void glScale{f d}(TYPE
rx,TYPE ry,TYPE rz);
Multiplie
la matrice courante par la matrice composition des affinités d'axe x, y et z et de
rapports respectifs rx, ry et rz.
Transformation
spécifique à la visualisation
- void gluLookAt(GLdouble
ex, GLdouble ey, GLdouble ez, GLdouble cx, GLdouble cy, GLdouble cz, GLdouble upx,
GLdouble upy, GLdouble upz);
Multiplie
la matrice courante (genéralement MODELVIEW) par la matrice donnant un point de vue depuis (ex,ey,ez)
avec une direction de visualisation passant par (cx,cy,cz). (upx,upy,upz) indique quelle
est la direction vers le haut.
gluLookAt est une fonction de la
bibliothèque GLU.
Transformations
de projection
- void glFrustum(GLdouble
g, GLdouble d, GLdouble b, GLdouble h, GLdouble cmin, GLdouble cmax);
Multiplie
la matrice courante par la matrice de projection en perspective définie par la pyramide
tronquée de plan supérieur défini par la diagonale (g,b,-cmin) (d,h,-cmin). cmin et
cmax sont les distances entre le point de vue et les plans de clipping. Ils doivent être
positifs.

- void gluPerspective(GLdouble
foc, GLdouble ratio, GLdouble cmin, GLdouble cmax);
Multiplie
la matrice courante par la matrice de projection en perspective définie par la focale foc
(angle d'ouverture verticale), l'apect-ratio ratio (largeur/hauteur) et les plans de
clipping -cmin et -cmax. cmin et cmax doivent avoir une valeur positive et respecter cmin
< cmax car il s'agit de distances selon l'axe z.

- void glOrtho(GLdouble g,
GLdouble d, GLdouble b, GLdouble h, GLdouble cmin, GLdouble cmax);
Multiplie
la matrice courante par la matrice de projection orthographique définie par le
parallélépipède (g,d,b,h,-cmin,-cmax). cmin et cmax peuvent être positifs ou
négatifs.

Un
programme de visualisation en projection parallèle
et projection en perspective
projections orthographique et en perspective



projection en perspective avec rapprochement
de la scène

projection en perspective: très grosses
déformations
Transformation d'affichage
- void glViewport(GLint
x,GLint y,GLsizei l,GLsizei h);
Définit le rectangle de pixels dans
la fenêtre d'affichage dans lequel l'image calculée sera affichée.
Un programme de changement de viewport

Utilisation de toute la surface de la
fenêtre d'affichage

Utilisation d'une partie seulement de la
fenêtre d'affichage
Opérations diverses
liées à la visualisation
Empile
la matrice courante dans la pile de matrices
Dépile
la matrice en haut de pile et remplace la matrice courante par celle-ci.
Définit un plan de clipping (découpage).
equ: tableau de quatre coefficients (a,b,c,d)
qui définissent l'équation ax+by+cz+d = 0 du plan de clipping.
plane: GL_CLIP_PLANEi avec
i compris entre 0 et 5.
glClipPlane(plane,equ) est à utiliser en
association avec glEnable(plane) et glDisable(plane) pour autoriser et interdire la
gestion du plan de clipping plane.

Programme exemple
Problème
L'affichage des scènes fait appel
à un repère virtuel associé au viewport de visualisation. Les dimensions fournies au
moment de l'exécution de la fonction de projection définissent ce repère qui peut donc
ne pas être homothétique au viewport. |
 |
 
Exemple: glFrustum(-1.,1.,-1.,1.,1.5,20.) associe le repère virtuel (-1,-1) - (1,1) au viewport
d'affichage. Si celui-ci n'a pas des tailles en x et y identiques, les objets dessinés
sont déformés.
Solution: Adapter aux dimensions du
viewport les dimensions données pour la définition de projection.
Exemple: Pour un viewport défini par
glViewport(0,0,w,h)
on pourra utiliser
gluPerspective(65.,w/h,1.0,20.0)
ce qui revient à adapter le ratio de gluPerspective au ratio du viewport.
 
Programme avec reshape homothétique
Exemples
- #include
<GL/gl.h>
#include <GL/glu.h>
#include "glaux.h"
static int shoulder = 0, elbow = 0;
void elbowAdd(void) {
elbow = (elbow + 5) % 360;
}
void elbowSubtract(void) {
elbow = (elbow - 5) % 360;
}
void shoulderAdd(void) {
shoulder = (shoulder + 5) % 360;
}
void shoulderSubtract(void) {
shoulder = (shoulder - 5) % 360;
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glPushMatrix();
glTranslatef(-1.0,0.0,0.0);
glRotatef((GLfloat) shoulder,
0.0,0.0,1.0);
glTranslatef(1.0,0.0,0.0);
auxWireBox(2.0,0.4,1.0);
glTranslatef(1.0,0.0,0.0);
glRotatef((GLfloat)
elbow,0.0,0.0,1.0);
glTranslatef(1.0,0.0,0.0);
auxWireBox(2.0,0.4,1.0);
glPopMatrix();
glFlush();
}
void myinit(void) {
glShadeModel (GL_FLAT);
}
void myReshape(int w,int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65.,
(float)w/(float)h,
1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0,0.0,-5.0);
}
int main(int argc,char** argv) {
auxInitDisplayMode(AUX_SINGLE|
AUX_RGB|
AUX_DIRECT);
auxInitPosition(0,0,400,400);
auxInitWindow(argv[0]);
myinit();
auxKeyFunc(AUX_LEFT,
shoulderSubtract);
auxKeyFunc(AUX_RIGHT,shoulderAdd);
auxKeyFunc(AUX_UP,elbowAdd);
auxKeyFunc(AUX_DOWN,elbowSubtract);
auxReshapeFunc(myReshape);
auxMainLoop(display);
}

Le programme
- #include
<GL/gl.h>
#include <GL/glu.h>
#include "glaux.h"
static int year = 0, day = 0;
void dayAdd(void) {
day = (day + 10) % 360;
}
void daySubtract(void) {
day = (day - 10) % 360;
}
void yearAdd(void) {
year = (year + 5) % 360;
}
void yearSubtract(void) {
year = (year - 5) % 360;
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glPushMatrix();
auxWireSphere(1.0);
glRotatef((GLfloat) year,
0.0,1.0,0.0);
glTranslatef(2.0,0.0,0.0);
glRotatef((GLfloat) day,
0.0,1.0,0.0);
auxWireSphere(0.2);
glPopMatrix();
glFlush();
}
void myinit(void) {
glShadeModel(GL_FLAT);
}
void myReshape(int w,int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,
(float) w/(float) h,
1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-5.0);
}
int main(int argc,char** argv) {
auxInitDisplayMode(AUX_SINGLE|
AUX_RGB);
auxInitPosition(0,0,500,500);
auxInitWindow(argv[0]);
myinit();
auxKeyFunc(AUX_LEFT,yearSubtract);
auxKeyFunc(AUX_RIGHT,yearAdd);
auxKeyFunc(AUX_UP,dayAdd);
auxKeyFunc(AUX_DOWN,daySubtract);
auxReshapeFunc(myReshape);
auxMainLoop(display);
}




Le programme
Les listes d'affichage
Définition
Une liste d'affichage est un ensemble
de commandes OpenGL stocké pour une utilisation future.
Quand une liste d'affichage est
invoquée, les commandes qu'elle contient sont exécutées dans l'ordre où elles ont
été stockées.
Les commandes d'une liste d'affichage
sont les mêmes que les commandes d'affichage immédiat.
Exemple
Dessin d'un polygone régulier de 100
sommets.
void
cercle(){
GLint i ;
GLfloat cosinus,sinus ;
glBegin(GL_POLYGON) ;
for ( i = 0 ; i < 100 ; i++ ) {
cosinus = cos(i*2*PI/100.0);
sinus = sin(i*2*PI/100.0);
glVertex2f(cosinus,sinus) ; }
glEnd() ;
}
Cette
méthode sans liste d'affichage est inefficace car tout appel à cercle() entraîne
l'exécution des calculs de sinus et cosinus.
#define CERCLE 1
void cercle() {
GLint i ;
GLfloat cosinus,sinus ;
glNewList(CERCLE,GL_COMPILE) ;
glBegin(GL_POLYGON) ;
for ( i = 0 ; i < 100 ; i++ ) {
cosinus = cos(i*2*PI/100.0);
sinus = sin(i*2*PI/100.0);
glVertex2f(cosinus,sinus) ; }
glEnd() ;
glEndList() ;
}
glCallList(CERCLE) ;
Programme
Fonctionnalités
Les listes d'affichages sont des
macros et, à ce titre, ne peuvent pas être modifiées ou paramétrées.
Les listes d'affichage
optimisent les temps de calcul et d'affichage car elles permettent la suppression de
calculs redondants sur:
les opérations matricielles,
les conversions de formats d'image
bitmap,
les calculs de lumière,
les calculs de propriétés des
matériaux de surface,
les calculs de modèle d'éclairage,
les textures,
les motifs de tracé.
L'inconvénient principal des listes
d'affichage est qu'elles peuvent occuper beaucoup de place mémoire.
Syntaxe
des commandes
Commandes principales
Indique le début de la
définition d'une liste d'affichage.
liste: entier positif unique qui identifiera la
liste.
mode: GL_COMPILE ou GL_COMPILE_AND_EXECUTE suivant que l'on désire
seulement stocker la liste ou la stocker et l'exécuter.
Indique la fin d'une liste
d'affichage.
Toutes les commandes depuis le dernier
glNewList ont été placées dans la liste d'affichage (quelques exceptions).
Exécute la liste d'affichage
référencée par liste.
Commandes auxiliaires
Alloue nb listes d'affichage
contiguës, non allouées auparavant.
L'entier retourné est l'indice
qui donne le début de la zone libre de références.
Retourne
vrai si liste est utilisé pour une liste d'affichage, faux sinon.
Détruit
les nb listes à partir de la liste l.
Exemple
- #include
<GL/gl.h>
#include <GL/glu.h>
#include "glaux.h"
GLuint listName = 1;
void myinit(void) {
glNewList(listName,GL_COMPILE);
glColor3f(1.0,0.0,0.0);
glBegin(GL_TRIANGLES);
glVertex2f(0.0,0.0);
glVertex2f(1.0,0.0);
glVertex2f(0.0,1.0);
glEnd();
glTranslatef(1.5,0.0,0.0);
glEndList();
glShadeModel(GL_FLAT);
}
void drawLine(void) {
glBegin(GL_LINES);
glVertex2f(0.0,0.5);
glVertex2f(15.0,0.5);
glEnd();
}
void display(void) {
GLuint i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,1.0,0.0);
for ( i = 0 ; i < 10 ; i++ )
glCallList(listName);
drawLine();
glFlush();
}
void myReshape(int w,int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if ( w <= h )
gluOrtho2D(0.,2.,
-0.5*(float)h/(float)w,
1.5*(float)h/(float)w);
else
gluOrtho2D(0.,
2.*(float)w/(float)h,
-.5,1.5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc,char** argv) {
auxInitDisplayMode(AUX_SINGLE|
AUX_RGB);
auxInitPosition(0,0,400,50);
auxInitWindow(argv[0]);
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
Le programme
Mode de lissage
mode: mode de lissage (GL_FLAT:
uni, GL_SMOOTH: Gouraud)

Lissé (utilisé par défaut)

Non
lissé
Les
calculs d'illumination
Les matériaux
La couleur d'un objet dépend du pourcentage de lumière rouge, verte et
bleue le touchant qu'il réfléchit (réflexions ambiante, diffuse et spéculaire) et de
la lumière qu'il émet intrinséquement.
Réflexions ambiante et diffuse -> couleur intrinsèque d'un objet
Réflexion spéculaire -> couleur des lumières de la scène
(généralement blanche ou grise)
Les lumières
Modélisation de l'éclairage au moyen de quatre lumières:
- de la lumière émise dans toutes les directions directement par les
objets pour eux-mêmes,
- de la lumière ambiante provenant de réflexions multiples et donc de
toutes les directions et réfléchie dans toutes les directions,
- de la lumière diffuse provenant d'une direction particulière et
réfléchie dans toutes les directions,
- de la lumière spéculaire provenant d'une direction particulière et
réfléchie dans une direction préférentielle.
La couleur de la lumière est définie par trois composantes rouge, verte
et bleue.
Exemple
- #include
<GL/gl.h>
#include <GL/glu.h>
#include "glaux.h"
void myinit(void) {
GLfloat specular[] = { 1.0,1.0,
1.0,1.0 };
GLfloat shinines[] = { 50.0 };
GLfloat l_pos[] = { 1.0,1.0,
1.0,0.0 };
glMaterialfv(GL_FRONT,GL_SPECULAR,
specular);
glMaterialfv(GL_FRONT,GL_SHININESS,
shinines);
glLightfv(GL_LIGHT0,GL_POSITION,
l_pos);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT|
GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0);
glFlush();
}
void myReshape(int w,int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-1.5,1.5,
-1.5*(float)h/(float)w,
1.5*(float)h/(float)w,
-10.,10.);
else
glOrtho(-1.5*(float)w/(float)h,
1.5*(float)w/(float)h,
-1.5,1.5,-10.,10.);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc,char** argv) {
auxInitDisplayMode(AUX_SINGLE|
AUX_RGB|
AUX_DEPTH);
auxInitPosition(0,0,500,500);
auxInitWindow(argv[0]);
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
Le
programme
Définition des propriétés d'un
matériau
- void glMaterial{i f}[v](GLenum f,GLenum pn,TYPE v);
Configuration des caractéristiques d'un matériau
f: GL_FRONT, GL_BACK ou GL_FRONT_AND_BACK
pour spécifier quelle face est configurée
pn: caractéristique affectée
v: valeurs affectées à la caractéristique pn
pn |
rôle |
| GL_AMBIENT |
couleur
ambiante |
| GL_DIFFUSE |
couleur
diffuse |
| GL_AMBIENT_AND_DIFFUSE |
couleurs
ambiante et diffuse |
| GL_SPECULAR |
couleur
spéculaire |
| GL_SHININESS |
focalisation
spéculaire (0 -> 128) |
| GL_EMISSION |
couleur
émise |
| GL_COLOR_INDEXES |
indexes des
couleurs ambiante, diffuse et spéculaire |
pn |
valeur par défaut |
GL_AMBIENT |
(0.2,0.2,0.2,1.0) |
GL_DIFFUSE |
(0.8,0.8,0.8,1.0) |
GL_AMBIENT_AND_DIFFUSE |
|
GL_SPECULAR |
(0.0,0.0,0.0,1.0) |
GL_SHININESS |
0.0 |
GL_EMISSION |
(0.0,0.0,0.0,1.0) |
GL_COLOR_INDEXES |
(0,1,1) |
Caractéristiques différentes pour les différents objets d'une
scène
Pour un même objet, utilisation des mêmes
caractéristiques optiques ou bien changement d'un sommet à un autre
Récupération de la
configuration du matériau
Lecture
des caractéristiques du matériau courant
f: GL_FRONT ou GL_BACK
pour spécifier quelle face est concernée par l'opération
pn: caractéristique affectée
v: tableau affecté au résultat de la
lecture de la caractéristique pn
Exemple
#include
<GL/gl.h>
#include <GL/glu.h>
#include "aux.h"
void myinit(void) {
GLfloat ambient[] = {0.0,0.0,0.0,1.0};
GLfloat diffuse[] = {1.0,1.0,1.0,1.0};
GLfloat specular[] = {1.0,1.0,1.0,1.0};
GLfloat position[] = {0.0,3.0,2.0,0.0};
GLfloat mod_ambt[] = {0.4,0.4,0.4,1.0};
GLfloat local_view[] = {0.0};
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
glLightfv(GL_LIGHT0,GL_POSITION,
position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,
mod_ambt);
glLightModelfv(GL_LIGHT_MODEL
_LOCAL_VIEWER,
local_view);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glClearColor(0.0,0.1,0.1,0.0);
}
void display(void) {
GLfloat no_mat[] = { 0.0,0.0,0.0,1.0 };
GLfloat no_shininess[] = { 0.0 };
GLfloat diffuse[] = { 0.1,0.5,0.8,1. };
glClear(GL_COLOR_BUFFER_BIT|
GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(-3.75,3.0,0.0);
glMaterialfv(GL_FRONT,GL_AMBIENT,
no_mat);
glMaterialfv(GL_FRONT,GL_DIFFUSE,
diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,
no_mat);
glMaterialfv(GL_FRONT,GL_SHININESS,
no_shininess);
glMaterialfv(GL_FRONT,GL_EMISSION,
no_mat);
auxSolidSphere(1.0);
glPopMatrix();
glFlush();
}
void myReshape(int w,int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if( w <=(h * 2) )
glOrtho(-6.,6.,
-3.*((float)h*2)/(float)w,
3.0*((float)h*2)/(float)w,
-10.0,10.0);
else
glOrtho(-6.0*(float)w/((float)h*2),
6.0*(float)w/((float)h*2),
-3.0,3.0,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc,char** argv) {
auxInitDisplayMode(AUX_SINGLE|
AUX_RGB|
AUX_DEPTH);
auxInitPosition(0,0,600,450);
auxInitWindow(argv[0]);
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
Le programme
Configuration de sources lumineuses
Gestion d'un maximum de 8
sources lumineuses
Les paramètres de ces
sources doivent être renseignés.
- void glLight{i f}[v](GLenum nb,GLenum pname,TYPE p);
Configuration d'une
source lumineuse
nb: GL_LIGHT0, GL_LIGHT1, ..., GL_LIGHT7, soit au total 8 sources lumineuses possibles
pname: caractéristique affectée
p: valeur affectée à la
caractéristique pname.
| pname |
rôle |
GL_AMBIENT |
(R,G,B,A):
couleur de la lumière ambiante ajoutée à la scène |
GL_DIFFUSE |
(R,G,B,A):
couleur de la lumière diffuse liée à la source lumineuse |
GL_SPECULAR |
(R,G,B,A):
couleur de la lumière spéculaire liée à la source lumineuse |
GL_POSITION |
(x,y,z,w):
position de la lumière
si w = 0, lumière placée à
l'infini, (x,y,z) donne la direction vers la source de lumière
si w != 0, non placée à l'infini,
(x,y,z) donne la position
|
GL_SPOT_DIRECTION |
orientation
du cone d'ouverture dans le cas d'un spot |
GL_SPOT_EXPONENT |
exposant
d'un spot (plus l'exposant est grand plus le spot est focalisé) |
GL_SPOT_CUTOFF |
angle
d'ouverture d'un spot |
pname |
rôle |
GL_CONSTANT_ATTENUATION |
facteur
d'attenuation constant: Kc |
GL_LINEAR_ATTENUATION |
facteur
d'attenuation linéaire: Kl |
GL_QUADRATIC_ATTENUATION |
facteur
d'attenuation quadratique: Kq |
Facteur d'attenuation: 
pname |
valeur par
défaut |
GL_AMBIENT |
(0.0,0.0,0.0,1.0) |
GL_DIFFUSE |
GL_LIGHT0:(1.0,1.0,1.,1.)
autres:(0.0,0.0,0.0,1.0) |
GL_SPECULAR |
GL_LIGHT0:(1.0,1.0,1.,1.)
autres:(0.0,0.0,0.0,1.0) |
GL_POSITION |
(0.0,0.0,1.0,0.0) |
GL_SPOT_DIRECTION |
(0.0,0.0,-1.0) |
GL_SPOT_EXPONENT |
0.0 |
GL_SPOT_CUTOFF |
180.0 |
GL_CONSTANT_
ATTENUATION |
1.0 |
GL_LINEAR_ATTENUATION |
0.0 |
GL_QUADRATIC_
ATTENUATION |
0.0 |
Exemples de définition de spots

Deux spots très focalisés

Ces deux spots moins focalisés

Aberrations liées à la facettisation
des objets à courbure
Le programme

Programme pour l'obtention de lumières colorées
Lecture de la configuration des sources
lumineuses
Lecture
de la configuration d'une des sources lumineuses
nb: GL_LIGHT0, GL_LIGHT1,
..., GL_LIGHT7
pname: caractéristique affectée
p: tableau destiné à la
récupération de la caractéristique pname.
Autorisation des calculs d'éclairage
Les calculs d'éclairage ne sont
réalisés qu'après exécution de
Chaque lumière (8 au maximum)
doit être autorisée.
Ces options peuvent être
annulées au moyen de glDisable.
Faute de cette autorisation, ce sont les informations de couleurs
spécifiées par les fonctions glColor* qui sont prises en compte.
Choix d'un modèle d'illumination
Le modèle d'illumination OpenGL gère les trois composantes suivantes:
- l'intensité de lumière ambiante globale permettant de fixer
l'éclairage minimum au sein de la scène,
- la position du point de vue (local à la scène, ou à l'infini)
utilisé pour l'évaluation des réflexions spéculaires.
- si les calculs d'éclairage doivent être effectués différemment pour
les deux faces des objets ou non.
Configuration du modèle
d'illumination
md: GL_LIGH_MODELE_AMBIENT, GL_LIGHT_MODELE_LOCAL_VIEWER,
GL_LIGHT_MODELE_TWO_SIDE
v: valeur affectée à md
Les bitmaps
Introduction
OpenGL permet la gestion de bitmaps en
autorisant les opérations de transfert entre le buffer couleur et la mémoire centrale.
Buts
gestion de fichiers
gestion de polices de
caractères (non traité)
gestion de textures (voir plus
loin)
Commandes
- void glReadPixels(GLint
x,GLint y,GLsizei l,GLsizei h,GLenum format,GLenum type,GLvoid *pixels);
Lecture des pixels d'un
frame-buffer et stockage en mémoire
x et y: position du coin
supérieur gauche du rectangle de pixels
l et w: dimensions du rectangle de pixels
format: information à lire sur les pixels
type: type du résultat à fournir
pixels: tableau destiné à recevoir les résultats
format |
Type de données pour les pixels |
GL_COLOR_INDEX |
Indexe
de couleurs |
GL_RGB |
Couleurs
RVB |
GL_RGBA |
Couleurs
RVBA |
GL_RED |
Composante
rouge |
GL_GREEN |
Composante
verte |
GL_BLUE |
Composante
bleue |
GL_ALPHA |
Composante
alpha |
GL_LUMINANCE |
Luminance |
GL_LUMINANCE_ALPHA |
Luminance
puis composante alpha |
GL_STENCIL_INDEX |
Stencil |
GL_DEPTH_COMPONENT |
Composante
de profondeur |
type |
Type C |
GL_UNSIGNED_BYTE |
Entier
8 bits non signé |
GL_BYTE |
Entier
8 bits signé |
GL_BITMAP |
Bits
dans des entiers 8 bits non signés |
GL_UNSIGNED_SHORT |
Entier
16 bits non signé |
GL_SHORT |
Entier
16 bits signé |
GL_UNSIGNED_INT |
Entier
32 bits non signé |
GL_INT |
Entier
32 bits signé |
GL_FLOAT |
Réel
simple précision |
- void glDrawPixels(GLsizei l,GLsizei h,GLenum f,GLenum type,GLvoid
*pixels);
Ecriture dans un frame-buffer de pixels
stockés en mémoire. Le rectangle de pixels est affiché avec son coin supérieur gauche
en position raster courante
l et w: dimensions du rectangle de pixels
f: information à écrire sur les pixels
type: type des données transmises
pixels: tableau destiné à transmettre les pixels
void glRasterPos{234}{sifd}{v}(TYPE x,TYPE y,TYPE z,TYPE w);
Fixe la position raster courante
Si 2 est utilisé z est fixé à 0 et w à 1.
Si c'est 3, w est fixé à 1
void glCopyPixels(GLint x,GLint y,GLsizei l,GLsizei h,GLenum type);
Copie depuis un buffer dans lui-même
x et y: position du coin supérieur gauche du rectangle source (la
position du rectangle destination donnée par la position raster courante)
l et w: dimensions du rectangle source
type: buffer sur lequel agir (GL_COLOR, GL_STENCIL ou GL_DEPTH)
Exemple: Sauvegarde
d'une image
void
sauve(char *nom,int px,
int py,int dx,int dy){
GLubyte *im ;
FILE *num ;
int y,x,t = dx*dy*3 ;
im =(GLubyte *) calloc(t,
sizeof(GLubyte));
glReadPixels(px,py,dx,dy,GL_RGB,
GL_UNSIGNED_BYTE,im);
num = fopen(nom,"wb") ;
if ( num ) {
for ( y = dy-1 ; y >= 0 ; y-- ) {
for ( x = 0 ; x < dx ; x++ ) {
fwrite((void *) &im[(x+y*dx)*3],
sizeof(GLubyte),
3,num) ; } }
fclose(num) ; }
free(im) ;
}
Ce programme lit une portion
rectangulaire (px, py, px+dx, py+dy) de la fenêtre d'affichage et la stocke dans un
tableau.
Ce tableau est ensuite sauvegardé
dans un fichier.
Programme exemple
Suite |