gillescpp
Messages postés33Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention22 octobre 2007
-
16 janv. 2007 à 21:53
gillescpp
Messages postés33Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention22 octobre 2007
-
18 janv. 2007 à 08:21
Voila,
J'ai un probleme avec opengl. J'explique rapidement : apres un appel de glGenTextures, il m'est impossible d'allouer de la mémoire dynamiquement : le moindre appel à new provoque l'arret du programme. Les tutoriaux que j'ai pu trouver sur le net n'utilisent pas le new apres un glGenTextures.
Il m'est impossible de contourner cette situation car je compte me'écrire un petit gestionnaire de textures (simple , sans singleton) dont voici l'ébauche :
tm.h :
#include <SDL/SDL.h>
#include <GL/GL.h>
#include <SDL/SDL_image.h>
#ifndef _TM_VERSION_
#define _TM_VERSION_ 0.1
class texturemanager
{
private :
int nombre; // nombre maximum de textures
GLuint textures; // contenant les textures
bool *occupees; // tableau pour savoir si elles sont occupees
public :
texturemanager(int nombre); // nombre total de textures voulu
~texturemanager(); // detruire
int ajouter(char* fichier); // retourne le numero qui a été assigné sinon : -1 si tout est occupé
bool supprimer(int nombre); // supprimer la texture voulue : le nom sera libre
bool appeler(int numero); // selectionner la texture courante
};
#endif
et tm.cpp :
#include "tm.h"
texturemanager::texturemanager(int nombre)
{
this->nombre = nombre;
glGenTextures(this->nombre, &this->textures); // appel ici
this->occupees = new bool[nombre];
for(int a = 0; a <nombre; a++)
occupees[a] = false; // pas de plantage si ces lignes sont en commentaires
}
texturemanager::~texturemanager()
{
for(int a = 0; a < this->nombre; a++)
{
if(this->occupees[a])
{
glDeleteTextures(1, &this->textures);
}
}
delete(this->occupees);
}
int texturemanager::ajouter(char* fichier)
{
SDL_Surface* dessin = NULL;
for(int a = 0; a < this->nombre; a++)
{
if(!this->occupees[a]) // si c'est libre
{
dessin = IMG_Load(fichier);
if(!dessin)
{
printf("erreur : le fichier n\' a pas pu etre charge : %s.\n", SDL_GetError());
}
glBindTexture(GL_TEXTURE_2D, a);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3, dessin->w, dessin->h, 0, GL_RGB, GL_UNSIGNED_BYTE, dessin->pixels);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
SDL_FreeSurface(dessin);
this->occupees[a] = true;
return a;
}
}
return -1; // tout est pris (desole)
}
/*bool texturemanager::supprimer(int numero)
{
if(numero < this->nombre)
{
if(this->occupees[numero])
{
glDeleteTextures(1, );
return true;
}
return true;
}
//throw new exception("index hors des valeurs"); // pas bon
return false;
}*/
bool texturemanager::appeler(int numero)
{
if(numero < this->nombre)
{
if(this->occupees[numero])
{
glBindTexture(GL_TEXTURE_2D, numero);
return true;
}
//throw new
return false;
}
//throw new
return false;
}
Je sous ouvert à tous commentaires ou à toutes suggestions...
::supprimer est en commentaire car elle me pose des soucis que je règlerais plus tard
gillescpp
Messages postés33Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention22 octobre 2007 17 janv. 2007 à 08:53
Bonjour,
Apparemment, les tableaux de textures doivent être déclarés en global et non dans une classe. En déclarant mon tableau de textures en global et en l'envoyant sous forme d'argument à mon gestionaire, mon programme s'exécute normalement.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 17 janv. 2007 à 18:18
Non, ya pas besoin que ce soit en global. Une texture, c'est juste un nombre, peu importe comment ce nombre est déclaré, ca genre rien. Mais comme je connais pas la SDL, peut etre que tu appelles une fonction OpenGL dans une fonction ou tu n'as pas le droit, c'est à dire hors d'un callback Opengl.
mais regarde ton code, c'est délirant. Tu stockes un tableau de texture dans un seul entier !
glGenTextures(this->nombre, &this->textures); // appel ici
gillescpp
Messages postés33Date d'inscriptionmercredi 19 février 2003StatutMembreDernière intervention22 octobre 2007 18 janv. 2007 à 08:21
mais regarde ton code, c'est délirant. Tu stockes un tableau de texture dans un seul entier !
glGenTextures(this->nombre, &this->textures); // appel ici
Et tu a tout a fait raison mais c'est ce que j'ai pu trouver dans de nombreux tutoriaux. D'ou ma compréhension erronnée qui m'a causé beaucoup de soucis par le passé.
J'ai donc utilisé une autre méthode qui consiste a utiliser un entier pour chaque texture ; ca fonctionne à merveille et mon gestionnaire est du coup quelque peu modifié.
Je le posterai en tant que source dès qu'il me paraîtra viable.