[opengl] glGenTextures et new

Résolu
gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 octobre 2007 - 16 janv. 2007 à 21:53
gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 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, &amp;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, &amp;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

Merci d'avance

3 réponses

gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 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.
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
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
3
gillescpp Messages postés 33 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 22 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.

Nicolas
0
Rejoignez-nous