chargement de textures en openGL - C++ - Programmation
Marsh Posté le 14-06-2006 à 14:55:40
utilise des std::vector<> des std::string, et des hash_map<string, ... > pour faire la résolution d'une texture par son nom.
dans la classe qui maintient ton modèle 3D, vu le bindTexture() tu maintiens la texture par son nom (char *):
évite ça, maintiens la dépendance à la texture par un entier ou un pointeur sur une structure via un boost::intrusive_ptr<>.
par exemple (ordre d'idée a pas prendre au pied de la lettre):
class Texture
{
public:
GLuint Handle;
std::string Name;
int ref_count;
Texture() : ref_count(0) {};
....
}
void intrusive_ptr_add_ref( Texture *ptr )
{
++ptr->ref_count;
}
void intrusive_ptr_release( Texture *ptr )
{
--ptr->ref_count;
}
class TextureManager
{
???::hash_map<std::string, Texture*> TexturePool;
// cherche la texture dans la hash_map<>, si y'a pas => charge la texture et la mets dans la hash_map
intrusive_ptr<Texture> GetTexture( const std::string &TextureFile );
// balaye la collection de textures et détruit les textures inutilisées
void GarbageUnusedTextures();
}
class Mesh
{
boost::intrusive_ptr<Texture> DiffuseTexture, BumpTexture;
int ref_count;
...
...
bool Load( const std::string &File );
void Render();
}
class MeshManager
{
???::hash_map<std::string, Mesh *>
// idem
intrusive_ptr<Texture> GetMesh( const std::string &MeshFile );
// plop purgage
void GarbageUnusedMeshes();
}
ce qui donne:
bool Mesh::Load( const std::string &File )
{
std::ifstream ifs( File.c_str() );
...
...
DiffuseTexture=TextureMan->GetTexture( DiffStr );
BumpTexture=TextureMan->GetTexture( BumpStr );
...
}
void Mesh::Render()
{
...
if( DiffuseTexture )
glBindTexture(GL_TEXTURE_2D, DiffuseTexture->Handle );
...
...
}
par exemple, à raffinner ou autre...
l'idée de ne pas détruire les instances automatiquement est nécessaire pour ne pas se tapper des chargement/destructions inutiles. (genre un vrai jeu ne détruit pas tout bêtement, mais par exemple au changement de niveau/scène)
(si ne maintiens les ressources que par la hash_map, attention a bien tout détruire par le destructeur)
Marsh Posté le 14-06-2006 à 15:17:08
tu peux même créer une méthode Bind() à la classe Texture pour te faciliter la vie (avec une variable membre qui stoque le GL_TEXTURE_2D et d'autres propriétées)
Marsh Posté le 14-06-2006 à 16:04:13
Bon, d'accord Merci Bjone je vais faire ça...
mais je pense que mon problème lui restera car pour le moment ce que tu critique fonctionnait. C'était sûrement pas propre (et je vais l'améliorer en suivant tes conseils). Mais est ce que tu verrait au niveau de l'openGL où est mon erreur ?
et encore Merci pour tes conseils
Marsh Posté le 14-06-2006 à 16:23:08
le problèmes c'est les "char * texture", ça buggue, ça fuit:
Code :
|
Code :
|
là devrait marcher, mais comme y'a pas les free() pour char * de mayrde, ça va fuire de partout => retour a ma première réponse (utilisation stl, boost)
Marsh Posté le 14-06-2006 à 17:24:52
Bon d'accord a l'unanimité ce que j'ai fait est pourri...
mais le problème c'est que je ne connais ni STL ni BOOST
il me reste plus qu'a apprendre... je reviandrai poser des questions sur ces deux librairies (je commence par STL )
Marsh Posté le 14-06-2006 à 17:49:14
Amonchakai a écrit : Bon d'accord a l'unanimité ce que j'ai fait est pourri... |
c'est pas si pourri, ça pourrait presque marcher, en fuiyant à gauche à droite (quoique le code de référence que je t'ai mis est pas complet )
mais c'est sûr, je peux te garantir que tu gagneras a regarder la STL & Boost.
Marsh Posté le 14-06-2006 à 19:57:37
oublies pas aussi les exceptions pour géré les erreurs, c'est tres pratique
Marsh Posté le 15-06-2006 à 08:03:35
Ok merci les gas...
Marsh Posté le 14-06-2006 à 14:08:03
Bonjour, je poste car j'ai un problème avec la classe que j'ai crée pour le chargement de textures en openGL.
donc voilà déja le code :
textureManager.h
textureManager.cpp
comme vous pouvez le remarquer j'utilise DevIL...
Bon mon problème c'est que je n'arrive pas a changer de texture : seule la dernière chargée s'affiche...
pourtant l'appel a fonction bindTexture() aurrait du permettre d'en changer mais rien ne se passe et je conserve la même texture...
Merci