Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/02/2008, à 15:33

dialloma

Problème avec les textures en openGL !

Bonjour à tous,

J'ai un petit problème avec openGL sur les textures. J'ai un code qui fait ceci:
run4.png . Cette 1ère image est en 2x2 et je souhaiterai, sans modifier l'image, mais seulement les coordonnées textures, avoir quelque chose comme ceci: echiquier_vide.gif, c'est à dire un échiquier.

Voici le code:

...........................................
...........................................
...........................................

// fonction de Rosenbrock tabul�e
const int w_img = 10; // largeur tableau ros
const int h_img = 10; // hauteur tableau ros
GLfloat ros[h_img*w_img*3]; // points (x,y,z)
GLfloat norm[h_img*w_img*3]; // normales (x,y,z)
GLfloat tex[h_img*w_img*2]; // coordonnees de texture

...........................................
................................
...........................................

// calcul des points d'�chantillonnage
void calculer_rosenbrock()
{
	int index=0;
	for( int i=0; i<w_img; ++i ) 
		for( int j=0; j<h_img; ++j )
		{  
			float x = xmin +  i * (xmax-xmin)/(w_img-1) ; 
			float y = ymin +  j * (ymax-ymin)/(h_img-1) ;
			// fonction de Rosenbrock
			float z = 100*(y-x*x)*(y-x*x) + (1-x)*(1-x);

			// points de la surface
			ros[index  ] = x;
			ros[index+1] = y;
			ros[index+2] = z;
			
			// vecteurs normaux � la surface
			float dzdx = -400*x*(y-x*x) - 2*(1-x);
			float dzdy = 200*(y-x*x);
			norm[index  ]=-dzdx;
			norm[index+1]=-dzdy;
			norm[index+2]=1;
			
			printf("normale: %f %f %f\n",norm[index], norm[index+1], norm[index+2]);
			 
			index+=3;
			
			if(z>zMax) zMax=z;
			//printf("%f %f %f\n",x,y,z);
			
			tex[2*(i*h_img+j)  ] = 8*(GLfloat) i/(w_img-1);
			tex[2*(i*h_img+j)+1] = 8*(GLfloat) j/(h_img-1);
			
		}
	
	// enumeration des indices pour un parcours TRIANGLE_STRIP
	index=0;
	for(int i=1; i<w_img; i++){
		for(int j=0; j<h_img; ++j)
		{
			indices[index++]= (i-1)*h_img+j;
			indices[index++]= (i  )*h_img+j;
		}
	}
	
	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3,GL_FLOAT,0,ros);
	glEnableClientState(GL_NORMAL_ARRAY);
	glNormalPointer(GL_FLOAT,0,norm);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glTexCoordPointer(2,GL_FLOAT,0,tex);
}

...........................................
...........................................
...........................................

Le tableauc qui contient les coordonnées de texture est:

GLfloat tex[h_img*w_img*2]

Merci de votre aide. C'est un peu urgent. Tout le week-end je galère sur ça.

Merci d'avance

Hors ligne

#2 Le 26/02/2008, à 13:22

Eldermê

Re : Problème avec les textures en openGL !

Si je comprends bien, tu veux que ta texture soit répétée pour avoir 8*8 cases à ton échiquier et pas seulement 2*2 ?

Dans ce cas, il me semble qu'il suffit de multiplier la matrice de texture par une échelle qui va bien, soit quelque chose dans ce genre-là :

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScalef(0.25,0.25,0.25);

Je suis pas sûre des valeurs qu'il faut passer à glScalef, il faudrait tester pour voir.

Pour répéter la texture, je crois qu'il faut mettre :

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);		
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

Mon blog : petit projet de jeux en 3D (libres, bien sûr).

Hors ligne

#3 Le 27/02/2008, à 07:01

dialloma

Re : Problème avec les textures en openGL !

merci Eldermê, je vais tester ça et je te tiens au courant. Merci

Hors ligne

#4 Le 27/02/2008, à 13:44

dialloma

Re : Problème avec les textures en openGL !

salut Eldermê, au fait j'ai ajouté les lignes de codes que tu m'as donné mais ça ne change pas vraiment de ce que j'avais avant. La texture ne se répete pas. ça agrandit juste la largeur de la texture. J'ai joué sur les différents paramètres de glScalef(0.25,0.25,0.25); mais c'est toujours le même éffet.

Hors ligne

#5 Le 27/02/2008, à 17:17

Eldermê

Re : Problème avec les textures en openGL !

Effectivement, je me suis trompée sur les valeurs. glScalef(0.25,0.25,0.25), ça agrandit la texture, alors qu'il faudrait la réduire. Essaie plutôt :

glScalef(4.,4.,4.)

Normalement, ça te devrait te faire une texture de côté 4 fois plus faible, ce qui devrait convenir, je pense. En tout cas, il faut des nombres plus grands que 1 (il y a 2 paramètres pour mettre une échelle suivant les deux directions de la surface, je ne sais pas trop à quoi sert le troisième ici).


Mon blog : petit projet de jeux en 3D (libres, bien sûr).

Hors ligne

#6 Le 27/02/2008, à 18:16

anthon

Re : Problème avec les textures en openGL !

Ca ça marche normalement

			tex[2*(i*h_img+j)  ] = (GLfloat) i*4/(w_img-1);
			tex[2*(i*h_img+j)+1] = (GLfloat) j*4/(h_img-1);

Hors ligne