ogla_small.gif (24003 octets)

11/07/01 18:13

OpenGL      (Partie 2)

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

 

WB01624_.gif (281 octets) 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);
}

Image106.gif (2424 octets) Image106.gif (2424 octets)

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.

Image001.gif (4287 octets)

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

Image002.gif (3721 octets)

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

Image003.gif (2792 octets)

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

Image050.gif (6207 octets)  Image051.gif (5353 octets)

projections orthographique et en perspective

Image052.gif (6361 octets)  Image053.gif (5612 octets)

Image054.gif (5052 octets)  Image055.gif (3863 octets)

Image056.gif (3501 octets)

projection en perspective avec rapprochement de la scène

Image057.gif (3164 octets)  Image058.gif (5291 octets)

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

Image004.gif (4613 octets)

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

Image005.gif (3591 octets)  Image005b.gif (3954 octets)

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.

Image020.jpg (11452 octets)

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.

Image006.gif (3216 octets)

Image007.gif (3324 octets)Image008.gif (2827 octets)

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.

Image009.gif (2512 octets)Image010.gif (2681 octets)

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

Image104.gif (3450 octets)

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

 

Image100.jpg (11047 octets)  Image101.jpg (10705 octets)

Programme pour l'obtention de lumières colorées

Lecture de la configuration des sources lumineuses

  • void glGetLight{i f}v(GLenum nb,GLenum pname,TYPE *p);

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

  • glEnable(GL_LIGHTING);

Chaque lumière (8 au maximum) doit être autorisée.

  • glEnable(GL_LIGHTi);

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

ogl_big.gif (6537 octets)                       ogla_big.gif (65244 octets)