Placage de texture (2/2)
Par Xavier Michelon


 
 
Création d'une texture procédurale

Nous avons vu le au cours du précédent tutoriel le principe des textures procédurales : il consiste à utiliser une fonction mathématique au lieu d’une image pour habiller un objet 3D. En guise de seconde texture pour notre cube, nous allons utiliser une texture procédurale basée sur la fonction mathématique cosinus. Dans un moteur 3D, le gros avantage des textures procédurales et qu’elles prennent peu de place en mémoire, contrairement à une image. Avec OpenGL nous n’allons pas tirer profit de cet avantage puisque nous devons passer par un tableau pour spécifier une texture avec glTexImage2D() : nous remplissons un tableau 2D avec les valeurs d’une fonction mathématique. Dans le programme exemple, le chargement de la texture procédurale se fait dans chargeTextureProc().

  for (i=0;i<256;i++)
    for (j=0;j<256;j++) {
      a=fonctionTexture(i,j);
      image[i][j][0]=a;       image[i][j][1]=128;       image[i][j][2]=128;
    }

De la même manière que pour une texture image, on parcourt le tableau à deux dimensions. Pour chaque cellule, on calcule la valeur ‘a’ de la fonction mathématique (nommée fonctionTexture()) pour le point considéré. Cette fonction renvoie une valeur comprise entre 0 et 255, puis on affecte une couleur dépendante de ‘a’ aux composantes rouge verte et bleue du point :

int fonctionTexture(int x,int y)
{
  float dx=(128.0-(float)x)/255.0*40.0;
  float dy=(128.0-(float)y)/255.0*40.0;
  float a=cos(sqrt(dx*dx+dy*dy)+decalage);
  return (int)((a+1.0)/2.0*255);  
}

Nous utilisons aujourd’hui comme fonction procédurale un cosinus  qui nous permet d’obtenir des cercles concentriques. Je ne rentre pas dans les détails mathématiques. Ceux d’entre-vous qui sont spécialistes n’auront aucun mal à décortiquer cette fonction.


Animation de la texture procedurale

Nous souhaitons animer la texture que nous venons de créer en faisant bouger les cercles concentriques générés par la fonction. On utilise pour cela une variable ‘décalage’ introduite dans le cosinus de la fonction procédurale, et la fonction de rappel d’oisiveté (‘idle’). Cette fonction dont nous avons déjà parlé est appelée chaque fois que le gestionnaire d’événements n’a rien à faire (pas d’événement clavier, souris,… à traiter). La définition d’une fonction de rappel d’oisiveté se fait grâce à :

void glutIdleFunc(void (*func)(void))

Dans la fonction de rappel, nous allons incrémenter la valeur du terme ‘décalage’. La fonction cosinus est périodique et sa période vaut 2 Pi, c’est-à-dire que cos(x+2Pi)=cos(x), et chaque fois que décalage devient supérieur à 2 Pi, on décrémente sa valeur de 2 Pi, ce qui permet d’éviter les problèmes de dépassement de capacité :

void inactif()
{
  /* increment du décalage */
  decalage+=0.1;
  if (decalage>2*PI)
    decalage-=2*PI;
  /* rechargement de la texture */
  chargeTextureProc(IdTex[1]);
  glutPostRedisplay();
}

Ce décalage va se traduire à l’écran par un léger déplacement des cercles constituant la texture. La répétition de ce décalage chaque fois que le gestionnaire de déplacement n’a rien à faire va produire l’effet de mouvement sur la texture.