L'exécutable


Activation de l'éclairage


Activation des 4 lumières


Lumière 0 configurée


Lumière 1 configurée


Lumière 2 configurée


Lumière 3 configurée


Toutes les lumières ensembles


Introduction d'une réflexion spéculaire


Différents matériaux

Fichier source : ParametrageMaterielEtLumieresSolution.cpp
Modules utilitaires

static int l = 0;
static int ldef = 0;
static int l0 = 0;
static int l1 = 0;
static int l2 = 0;
static int l3 = 0;
static int ms = 0;
static int md = 0;
static int ma = 0;
static int me = 0;

static void activationLumieres(void) {
  if ( l )
    glEnable(GL_LIGHTING);
    else
    glDisable(GL_LIGHTING);
  if ( l0 )
    glEnable(GL_LIGHT0);
    else
    glDisable(GL_LIGHT0);
  if ( l1 )
    glEnable(GL_LIGHT1);
    else
    glDisable(GL_LIGHT1);
  if ( l2 )
    glEnable(GL_LIGHT2);
    else
    glDisable(GL_LIGHT2);
  if ( l3 )
    glEnable(GL_LIGHT3);
    else
    glDisable(GL_LIGHT3);
}

static void configurationLumieres(void) {
  const GLfloat magenta[]     = { 1.0F,0.0F,1.0F,1.0F };
  const GLfloat rouge[]       = { 1.0F,0.0F,0.0F,1.0F };
  const GLfloat vert[]        = { 0.0F,1.0F,0.0F,1.0F };
  const GLfloat bleu[]        = { 0.0F,0.0F,1.0F,1.0F };
  const GLfloat jaune[]       = { 1.0F,1.0F,0.0F,1.0F };
  const GLfloat grisMoyen[]   = { 0.5F,0.5F,0.5F,1.0F };
  const GLfloat pos0[] = { 2.0F,2.0F,2.0F,1.0F };
  glLightfv(GL_LIGHT0,GL_POSITION,pos0);
  glLightfv(GL_LIGHT0,GL_DIFFUSE,rouge);
  glLightfv(GL_LIGHT0,GL_SPECULAR,noir);
  glLightfv(GL_LIGHT0,GL_AMBIENT,noir);
  const GLfloat pos1[] = { -2.0F,0.0F,4.0F,0.0F };
  glLightfv(GL_LIGHT1,GL_POSITION,pos1);
  glLightfv(GL_LIGHT1,GL_DIFFUSE,vert);
  glLightfv(GL_LIGHT1,GL_SPECULAR,blanc);
  glLightfv(GL_LIGHT1,GL_AMBIENT,noir);
  const GLfloat pos2[] = { -3.0F,-3.0F, 15.0F,1.0F };
  const GLfloat dir2[] = {  3.0F, 3.0F,-10.0F };
  glLightfv(GL_LIGHT2,GL_POSITION,pos2);
  glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,dir2);
  glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,20.0F);
  glLightfv(GL_LIGHT2,GL_DIFFUSE,bleu);
  glLightfv(GL_LIGHT2,GL_SPECULAR,jaune);
  glLightfv(GL_LIGHT2,GL_AMBIENT,noir);
  const GLfloat pos3[] = {  0.0F,0.0F,0.0F,1.0F };
  glLightfv(GL_LIGHT3,GL_POSITION,pos3);
  glLightfv(GL_LIGHT3,GL_DIFFUSE,noir);
  glLightfv(GL_LIGHT3,GL_SPECULAR,noir);
  glLightfv(GL_LIGHT3,GL_AMBIENT,magenta);
}

static void configurationMateriel(void) {
  const GLfloat diffuseDefaut[]  = { 0.8F,0.8F,0.8F,1.0F };
  const GLfloat ambientDefaut[]  = { 0.2F,0.2F,0.2F,1.0F };
  const GLfloat specularDefaut[] = { 0.0F,0.0F,0.0F,1.0F };
  const GLfloat emissionDefaut[] = { 0.0F,0.0F,0.0F,1.0F };
  const GLfloat magenta[]        = { 1.0F,0.0F,1.0F,1.0F };
  const GLfloat cyan[]           = { 0.0F,1.0F,1.0F,1.0F };
  const GLfloat jaune[]          = { 1.0F,1.0F,0.0F,1.0F };
  if ( md ) {
    glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,magenta); }
    else {
    glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuseDefaut); }
  if ( ma ) {
    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,cyan); }
    else {
    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambientDefaut); }
  if ( me ) {
    glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,jaune); }
    else {
    glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emissionDefaut); }
  if ( ms ) {
    glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,64.0);
    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,blanc); }
    else {
    glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specularDefaut); }
}

/* Fonction executee lors d'un rafraichissement */
/* de la fenetre de dessin                      */

static void display(void) {
  const float *fond;
  switch (cFond) {
    case 0 :
      fond = gris;
      break;
    case 1 :
      fond = blanc;
      break;
    case 2 :
      fond = noir;
      break; }
  glClearColor(fond[0],fond[1],fond[2],fond[3]);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPolygonMode(GL_FRONT_AND_BACK,(pMode == 1) ? GL_FILL : GL_LINE);
  glPushMatrix();
  glPushAttrib(GL_LIGHTING_BIT);
  int notReset = 1;
  activationLumieres();
  configurationLumieres();
  configurationMateriel();
  if ( ldef ) {
    notReset = 0;
    glPopAttrib();
    activationLumieres(); }
  glRotatef(r1,1.0F,2.0F,3.0F);
  glRotatef(r2,-1.0F,2.0F,-3.0F);
  scene();
  if ( notReset ) {
    glPopAttrib(); }
  glPopMatrix();
  glFlush();
  glutSwapBuffers();
  int error = glGetError();
  if ( error != GL_NO_ERROR )
    printf("Attention erreur %d\n",error);
}

/* Fonction executee lors de l'appui            */
/* d'une touche alphanumerique du clavier       */

static void keyboard(unsigned char key,int x,int y) {
  switch (key) {
    case 0x0D :
      l = !l;
      glutPostRedisplay(); 
      break;
    case 43 :
      sz /= 1.01;
      glutPostRedisplay(); 
      break;
    case 45 :
      sz *= 1.01;
      glutPostRedisplay(); 
      break;
    case 'a' :
      { anim = !anim;
        glutIdleFunc(( anim ) ? idle : NULL); }
      break;
    case 'z' :
      { pMode = !pMode;
        glutPostRedisplay(); }
      break;
    case 'f' :
      { cFond = (cFond+1)%3;
        glutPostRedisplay(); }
      break;
    case 'F' :
      { static int full = 0;
        static int wFx;
        static int wFy;
        full = !full;
        if ( full ) {
          wFx = glutGet(GLUT_WINDOW_WIDTH);
          wFy = glutGet(GLUT_WINDOW_HEIGHT);
          wPx = glutGet(GLUT_WINDOW_X);
          wPy = glutGet(GLUT_WINDOW_Y);
          glutFullScreen(); }
          else {
          glutPositionWindow(wPx,wPy);
          glutReshapeWindow(wFx,wFy); } }
      break;
    case 0x1B :
      exit(0);
      break; }
}

/* Fonction executee lors de l'appui            */
/* d'une touche speciale du clavier :           */
/*   - touches de curseur                       */
/*   - touches de fonction                      */

static void special(int specialKey,int x,int y) {
  switch(specialKey) {
    case GLUT_KEY_F5 :
      ms = !ms;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F6 :
      md = !md;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F7 :
      ma = !ma;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F8 :
      me = !me;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F1 :
      l0 = !l0;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F2 :
      l1 = !l1;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F3 :
      l2 = !l2;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F4 :
      l3 = !l3;
      glutPostRedisplay();
      break;
    case GLUT_KEY_F10 :
      ldef = !ldef;
      glutPostRedisplay();
      break;
    case GLUT_KEY_UP :
      r1 += 1.0F;
      glutPostRedisplay();
      break;
    case GLUT_KEY_DOWN :
      r1 -= 1.0F;
      glutPostRedisplay();
      break;
    case GLUT_KEY_RIGHT :
      r2 += 1.0F;
      glutPostRedisplay();
      break;
    case GLUT_KEY_LEFT :
      r2 -= 1.0F;
      glutPostRedisplay();
      break; }
}

RETOUR