BMP Transparante

Signaler
Messages postés
89
Date d'inscription
mercredi 25 juin 2003
Statut
Membre
Dernière intervention
14 septembre 2007
-
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
-
Voila j'ai un petit soucis de transparance avec les images BMP

J'afficher mes arbres en utilisant le format TGA, mais la transparance
ne semble marcher que pour les images 32Bit !!! sa rame trop donc je
veux pas.

J'ai donc choisis d'utiliser deux images BMP, et voici le code :



void CreateListTree(UINT TextureTree, UINT MaskTexture, GLuint index)

{

glNewList(index,GL_COMPILE);

{



//glDisable(GL_DEPTH_TEST);


glDisable(GL_CULL_FACE);
// Turn off back face culling

glBlendFunc(GL_DST_COLOR, GL_ZERO); // Blend Screen Color With Zero (Black)

glEnable(GL_TEXTURE_2D);

glEnable(GL_BLEND);



// Mask

glBindTexture(GL_TEXTURE_2D, MaskTexture);

glBegin(GL_QUADS);

glTexCoord2f(0,0);

glVertex3f(-2,0,0);

glTexCoord2f(1,0);

glVertex3f(2,0,0);

glTexCoord2f(1,1);

glVertex3f(2,4,0);

glTexCoord2f(0,1);

glVertex3f(-2,4,0);



glTexCoord2f(0,0);

glVertex3f(0,0,-2);

glTexCoord2f(1,0);

glVertex3f(0,0,2);

glTexCoord2f(1,1);

glVertex3f(0,4,2);

glTexCoord2f(0,1);

glVertex3f(0,4,-2);

glEnd();



// Texture

glBlendFunc(GL_ONE, GL_ONE);

glBindTexture(GL_TEXTURE_2D, TextureTree);

glBegin(GL_QUADS);

glTexCoord2f(0,0);

glVertex3f(-2,0,0);

glTexCoord2f(1,0);

glVertex3f(2,0,0);

glTexCoord2f(1,1);

glVertex3f(2,4,0);

glTexCoord2f(0,1);

glVertex3f(-2,4,0);



glTexCoord2f(0,0);

glVertex3f(0,0,-2);

glTexCoord2f(1,0);

glVertex3f(0,0,2);

glTexCoord2f(1,1);

glVertex3f(0,4,2);

glTexCoord2f(0,1);

glVertex3f(0,4,-2);

glEnd();



glDisable( GL_BLEND
); // Turn off
blending


glEnable(GL_CULL_FACE);
// Turn on back face culling


glDisable(GL_TEXTURE_2D); // Turn
on texture mapping if it's not already

//glEnable(GL_DEPTH_TEST);



}

glEndList();

}



le truc c'est que les arbre sont tous noir !!!!

remarquez que si juncommente glEnable(GL_DEPH_TEST) rien ne s'affiche du tout !!

mais voila se que j'obtien :





quelquun a une idée ?

merci bien



barraq

6 réponses

Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Salut Barraq !!!, commence a avoir de la gueule ton soft !!! Félicitation !!!.

Pour la transparence, j'ai deja utilisé du RGBA avec du TGA et ca marche donc chope peut etre un autre loader....

Pour l'histoire des BMP j'ai pas trop compris comment tu les melanges (j'ai regarde vite fait... j'ai plus le tps de rien faire....) on dirai que tu fais du multi-texturing en dessinant 2 fois le meme objet...., mais au sinon, si tu as les arbres noirs ,cela peut etre un probleme de couleur ou une mauvaise fonction de blending ou les deux.

Désolé, j'ai pas mon book d'OpenGL sous la main... il est au boulot....

KeniiyK
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Au fait si tu veux faire un truc du style BMP1 ==RGB et BMP2==Alpha, tu peux toujours reconstitue ton image RGBA dans le code.....

KeniiyK
Messages postés
89
Date d'inscription
mercredi 25 juin 2003
Statut
Membre
Dernière intervention
14 septembre 2007

Merci bien pour le compliement



sinon pour les BMPs sa avance un petit peu, le noir vient du fait que
le system de double couche de BMP de marche pas avec le
multi-texturing... donc j'ai placé a dessiner les arbres aprés
l'affichage de la map et sa allé déja mieux, ensuite j'affiche le
skybox avant car la couleur noir semblait venir du fait que le fond de
mon écran est noir avant que j'affiche mon skybox.



Mais cela n'empeche pas que je n'est pas le meme résultat que avec TGA....

mais meme si je change de loader 32bit sa rest HUGE pour une texture....

Enfin la dead line c dans 3 jours, donc je vais implementer les deux versions.

Si je trouve la solution je la posterais ici.



Et bientot toutes les sources de mon code seront mis en ligne, mais faut que j'attend mon examination avant ...

pensez a moi c'est en anglais



Et toi sa marche le boulot ?



See ya
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Alors ?, t'as trouve ton erreur ?

Figure toi que pas plus tard qu'hier j'ai eu la meme erreur d'affichage... maintenant, a savoir si c'est la meme que toi...
J'affichais mon terrain en multitexturing puis apres quelques objets et ceux qui utilisaient une texture etaient tout noir.... L'erreur c'est que je ne désactivais pas totalement/correctement les étages de textures apres le rendu du terrain et SURTOUT il faut toujours active le premier etage de texture en sortie... (il me semble que je te l'avais dis... en voici la preuve ...).

Sinon coté boulot c'est impec'... rien à dire... OpenGL / C++ ... ambiance sympa ... c la fete...

KeniiyK
Messages postés
89
Date d'inscription
mercredi 25 juin 2003
Statut
Membre
Dernière intervention
14 septembre 2007

Hum donc mon erreur sa doit venir de la meme chose...

Pour afficher un block de mon octree je procede comme cela



bool Terrain::DrawObject(VObject *CurrentObject)

{

int g_DetailScale = 128;



if( _Flag->rCanDraw() && CurrentObject != NULL )

{

// Enable all client states being used.

glEnableClientState(GL_VERTEX_ARRAY);



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



////Set up multitexturing



glActiveTextureARB( GL_TEXTURE0_ARB );

glClientActiveTextureARB(GL_TEXTURE0_ARB);

glEnableClientState( GL_TEXTURE_COORD_ARRAY );

glTexCoordPointer(2, GL_FLOAT, 0, _CObject->_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()->rDetail() )

{

glActiveTextureARB( GL_TEXTURE1_ARB );

glEnable( GL_TEXTURE_2D );

glClientActiveTextureARB(GL_TEXTURE1_ARB);

glEnableClientState( GL_TEXTURE_COORD_ARRAY );

glTexCoordPointer(2, GL_FLOAT, 0, _CObject->_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

glDrawElements(GL_TRIANGLES,
CurrentObject->_NumberOfVertices, GL_UNSIGNED_INT,
CurrentObject->_VectMapIndices);

//glDrawElements(GL_TRIANGLES,
_CObject->_NumberOfVertices, GL_UNSIGNED_INT,
_CObject->_VectMapIndices);



//// Disable all the client states we enabled.

glDisableClientState(GL_VERTEX_ARRAY);

glDisableClientState(GL_TEXTURE_COORD_ARRAY);



if( _GLCtrl->GetFlag()->rDetail() )

{

// 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()->rLighting() )

glEnable(GL_LIGHTING);



return true;

}



return false;

}



Je pense tout fermer ce que tu as dis non ?



Bien dla chance pour ton job, moi je me prend la tête comme un taré pour mon rapport !!

je crois que je v me planter le niveau est trop haut pour mon pauvre petit niveau d'anglais



A plus
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Ben voila mon code de rendu du terrain :

// activation de l'unite de texture 0
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,_textureNames[0]);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);

// activation de l'unite de texture 1
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,_textureNames[1]);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);

// coords de l'unite de texture 0
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2,GL_FLOAT,0,_texCoordArrayUnit0);



// coords de l'unite de texture 1
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2,GL_FLOAT,0,_texCoordArrayUnit1);

// activation des differents tableaux
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

// les tableaux....
glColorPointer(4,GL_FLOAT,0,_colorArray);
glNormalPointer(GL_FLOAT,0,_normalArray);
glVertexPointer(3,GL_FLOAT,0,_vertexArray);

// on dessine
glDrawArrays(GL_TRIANGLES,0,3*_numFaces);


// disable des tableaux
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

// disable coord unit 1
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);


// disable coord unit 0
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);


// disable unit 1
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);


// disable unit 0
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_TEXTURE_2D);

Et voila...., maintenant que j'ai poste je remarque qu'il y a peut etre des appels inutiles, mais ca marche...

Bonne chance pour ton rapport et ta soutenance !!

KeniiyK