Multi-texturing

Résolu
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007 - 12 avril 2005 à 22:05
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 - 13 avril 2005 à 19:09
Voila j'affiche ma scene avec cette fonction :



void Terrain::Draw(VObject *CurrentObject)

{

int g_DetailScale = 128;



//Texture 0

glActiveTextureARB( GL_TEXTURE0_ARB );

glEnableClientState( GL_TEXTURE_COORD_ARRAY );

glEnable( GL_TEXTURE_2D );

glBindTexture( GL_TEXTURE_2D, _Texture[0] );

glTexCoordPointer( 2, GL_FLOAT, 0, CurrentObject->_TextureCoords );



//Configure le blending des 2 textures

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);

glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2);



//Texture 0 dans TU 1

glActiveTextureARB( GL_TEXTURE1_ARB );

glBindTexture( GL_TEXTURE_2D, _Texture[1] );

glEnable( GL_TEXTURE_2D );

glMatrixMode(GL_TEXTURE);

glLoadIdentity();

glScalef((float)g_DetailScale, (float)g_DetailScale, 1);

glTexCoordPointer( 2, GL_FLOAT, 0, CurrentObject->_TextureCoords );

glMatrixMode(GL_MODELVIEW);



//Affichage

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, CurrentObject->_Vertices);

glDrawArrays( GL_TRIANGLES, 0, CurrentObject->_TriangleCount*3);



//Désactive la TU 1

glEnable(GL_TEXTURE_2D);

glDisableClientState( GL_TEXTURE_COORD_ARRAY );

}



dans Texture[0] j'ai la grande texture de ma map, et dans texture[1] une petite qui sert a afficher les details.



L'ennui est que je n'arrive pas a avoir Deux echelle differente pour mes texture :(

tout est la l'echelle de la grande ou de la petite....



ya t'il une solution ?

4 réponses

barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
13 avril 2005 à 09:18
En fait l'idee d'avoir plusieur taille de texture est que la premiere
est ta texture général, que tu étire, et la deuxieme est une que tu
repete a l'interieur de ton objet, une sorte de texture "grain" si tu
veux.

Donc par exemple sur une grande map, cela permet d'avoir un effet vraiment réaliste ;)

je peu pas mettre de screen shot mais mon prog est bientot finis donc tu verras.



Mais j'ais trouvé la solution en fait aprés chaque



glActiveTextureARB( GL_TEXTURE1_ARB ); il faut mettre


glClientActiveTextureARB( GL_TEXTURE1_ARB );

pourquoi je ne c'est pas

si ya un boss en opengl par la sa serai le bien venu de savoir pourquoi



enfin voila la fonction de tracé :





<hr style="width: 100%; height: 2px;">

void Terrain::DrawObject(VObject *CurrentObject)

{

int g_DetailScale = 128;



// Enable all client states being used.

glEnableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_NORMAL_ARRAY);



glVertexPointer(3, GL_FLOAT, 0, CurrentObject->_Vertices);



//Set up multitexturing



glActiveTextureARB( GL_TEXTURE0_ARB );

glClientActiveTextureARB(GL_TEXTURE0_ARB);

glEnableClientState( GL_TEXTURE_COORD_ARRAY );

glTexCoordPointer(2, GL_FLOAT, 0, CurrentObject->_TextureCoords);

glBindTexture( GL_TEXTURE_2D, _Texture[1]);



glEnable( GL_TEXTURE_2D );

glBindTexture( GL_TEXTURE_2D, _Texture[0]);



// If detail texturing is required, render the second texture

if(_GLCtrl->GetFlag()->_bDetail)

{

glActiveTextureARB( GL_TEXTURE1_ARB );

glEnable( GL_TEXTURE_2D );

glClientActiveTextureARB(GL_TEXTURE1_ARB);

glEnableClientState( GL_TEXTURE_COORD_ARRAY );

glTexCoordPointer(2, GL_FLOAT, 0, CurrentObject->_TextureCoords);



// Now we want to enter the texture matrix. This will allow us

// to change the tiling of the detail texture.

glMatrixMode(GL_TEXTURE);



// Reset the current matrix and apply our chosen scale value

glLoadIdentity();

glScalef((float)g_DetailScale, (float)g_DetailScale, 1);



// Leave the texture matrix and set us back in the model view matrix

glMatrixMode(GL_MODELVIEW);



glBindTexture( GL_TEXTURE_2D, _Texture[1]);



glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);

glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2);

}



// Render



glDrawArrays( GL_TRIANGLES, 0, CurrentObject->_TriangleCount*3);



// Disable all the client states we enabled.

glDisableClientState(GL_VERTEX_ARRAY);

glDisableClientState(GL_NORMAL_ARRAY);

glDisableClientState(GL_TEXTURE_COORD_ARRAY);



if(_GLCtrl->GetFlag()->_bDetail)

{

// Disable the 2nd texture

glActiveTextureARB(GL_TEXTURE1_ARB);

glDisable(GL_TEXTURE_2D);



// Switch back to the first texture

glActiveTextureARB( GL_TEXTURE0_ARB );

glClientActiveTextureARB(GL_TEXTURE0_ARB);

}



if( _GLCtrl->GetFlag()->_bLighting )

glEnable(GL_LIGHTING);

}
3
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
13 avril 2005 à 07:32
je vais peut-être dire une bétise mais il me semble que çà devrait marcher comme çà . Sinon tu n'as qu'à scaler les coordonnées de la texture comme çà tu aura deux échelle différente .
Je ne saisi pas très bien ce que tu veux faire avec deux échelle différente: prend deux texture qui se prêtent directement à ton porgramme sans avoir à les mettre à l'échelle .

A m a u r y
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
13 avril 2005 à 18:38
Je sais pas si ca fait de moi un pro OpenGL, mais l'explication est que comme tu utilises les tableaux de sommets pour rendre ta géométrie (VertexArray), et bien il faut que "tout s'accordent" c-a-d les normales (NormalArray), les coords de texture (TextureCoordArray) et ensuite parce que tu utilises le multitexturing il faut bien une fonction pour preciser a quelle unité de texture s'applique le tableaux de coord texture precedement defini..., cette fonction est donc glClientActiveTextureARB( GL_TEXTUREi_ARB ); i=l'unité de texture.

Voilou, je sais pas si j'ai ete tres clair....

@+, KeniiyK
0
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
13 avril 2005 à 19:09
je me disait bien aussi que c'était bizarre de pas activer chaque
texture :) mais comme je programme pas tous les jour avec le
multitexturing j'avais un peu oublié...

A m a u r y
0
Rejoignez-nous