Texture !! [memory]

barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007 - 10 avril 2005 à 22:04
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 - 13 mai 2005 à 23:36
salut, voila dans mon programme a l'initialisation je crée des textures en utilisant cette fonction :



bool CreateTexture(UINT &texture, LPCTSTR strFileName)

{

AUX_RGBImageRec *pImage = NULL;



ifstream File;

File.open (strFileName, ios::in | ios::binary);



if( File.is_open() )

{

// Load the bitmap using the aux function stored in glaux.lib

pImage = auxDIBImageLoad(strFileName);



File.close();



// Make sure valid image data was given to pImage, otherwise return false


if(pImage == NULL)




return false;



// Generate a texture with the associative texture ID stored in the array

glGenTextures(1, &texture);



// This sets the alignment requirements for the start of each pixel row in memory.

glPixelStorei (GL_UNPACK_ALIGNMENT, 1);



// Bind the texture to the texture arrays index and init the texture

glBindTexture(GL_TEXTURE_2D, texture);



// Build Mipmaps (builds different versions of the picture for distances - looks better)

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pImage->sizeX,



pImage->sizeY, GL_RGB,
GL_UNSIGNED_BYTE, pImage->data);



//Assign the mip map levels and texture info

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);



// Now we need to free the image data that we loaded since openGL stored it as a texture




if (pImage)


// If we loaded the image

{


if
(pImage->data)

// If there is texture data

{



free(pImage->data);

// Free the texture data, we don't need it anymore

}




free(pImage);


// Free the image structure

}

}

else

{

string msgerror = "File : ";

msgerror += strFileName; msgerror += " CORRUPTED !";

MessageBox(NULL, msgerror.c_str(), 0, 0);

}



return true;

}




l'ennui est que l'on peu fermer le monde dans le quel en ouvrir un autre, donc on va lire de nouvelle textures......



Donc comment liberer les textures que j'utilisée avant ???

car la a chaque foi que je change de map, je perd 5Mo en memoire !!!



Merci a vous.....

5 réponses

barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
10 avril 2005 à 22:27
Ok, ok..... je n'ais pas d'excuse......

[trouvé on MSDN]



The glGenTextures function returns n texture names in the
textures parameter. The texture names are not necessarily a contiguous
set of integers, however, none of the returned names can have been in use
immediately prior to calling the glGenTextures function. The generated
textures assume the dimensionality of the texture target to which they are first
bound with the [glfunc01_3bad.htm glBindTexture] function.
Texture names returned by glGenTextures are not returned by subsequent
calls to glGenTextures unless they are first deleted by calling [glfunc01_6vqr.htm glDeleteTextures].



______________________________________________________________________



Parcontre une autre question......

Supposons une application fonctionnant sur P2P, donc une sorte de jeux
en reseau ou les joueurs peuvent se connecter et deconnecter tout le
temps.



Chaque joueurs possedent une texture que je ne connais pas....

a intervalle régulié j'update la liste des joueurs et ainsi les textures !!

peu on changer comme cela les texutres utilisé par opengl ???

Car dans tous les exemples que j'ai vue, les textures sont laucher au début de l'application et effacée a la fin.

Donc ma question est COMMENT CHAGER DE TEXTURE DINAMIQUEMENT ?

jespere avoir été claire



merci
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
11 avril 2005 à 20:14
Salut, tu as deja la reponse : oui. Tu delete les textures résidentes (glAreTextureResident et glDeleteTextures). Puis re-belote glGenTextures, glBindTexture() Load ,etc ...

KeniiyK
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
11 avril 2005 à 20:20
Et au fait glTexEnv*(), est "globale" a toutes les textures, la texture active (par le bind) n'est pas affecté, donc si les parametres sont equivalents pour toutes les textures un seul appel suffit, par contre si plusieurs environnement, alors il faut faire les bons appels au rendu.

KeniiyK
0
barraq Messages postés 89 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 14 septembre 2007
13 mai 2005 à 10:04
je pense que faire :



glGenTextures, glBindTexture() chaque frame, OpenGL va exploser

sa me parais bizard....

Je pensais plutot qu'il fallai déclarer une texture de base avec des dimensions une résolution, et UN POINTEUR

et donc que le truc a faire serais de changer l'info dans la zone mémoire pointé par le pointeur.....

donc si l'images est envoyé en binaire via P2P et ben g just a la copier tel quel dans ma memoire et hop....



Peut on faire comme cela, mais le plus important COMMENT



cheeze
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
13 mai 2005 à 23:36
Ok je vois ce que tu veux faire, c clair que ca serai trop bien mais... ca n'est pas possible vu que OpenGL stocke les textures en memoire video. Par contre j'ai jamais utilise les glSubTexture (ou un truc dans le genre ...) peut etre que ca sert a ca.... Ou alors il y a peut etre une extension style ARB ou autre qui permet de le gerer "assez rapidement"... (Un peu comme la source des "climaps vertex" dans les sources d'OpenGL, je sais pas si tu l'a teste mais ca a l'air bien puissant surtout qu'il y a un algo de LOD avec...)

Bah voila, desole..., je peut pas t'en dire plus que ca.

KeniiyK
0
Rejoignez-nous