Placage de texture (2/2) Par Xavier Michelon |
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 dune 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 quelles prennent peu de place en mémoire, contrairement à une image. Avec OpenGL nous nallons 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 dune 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 aujourdhui comme fonction procédurale un cosinus qui nous permet dobtenir des cercles concentriques. Je ne rentre pas dans les détails mathématiques. Ceux dentre-vous qui sont spécialistes nauront aucun mal à décortiquer cette fonction.
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 doisiveté (idle). Cette fonction dont nous avons déjà parlé est appelée chaque fois que le gestionnaire dévénements na rien à faire (pas dévénement clavier, souris, à traiter). La définition dune fonction de rappel doisiveté 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, cest-à-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 na rien à faire va produire leffet de mouvement sur la texture.
|