[opengl] glGenTextures et new [Résolu]

gillescpp 33 Messages postés mercredi 19 février 2003Date d'inscription 22 octobre 2007 Dernière intervention - 16 janv. 2007 à 21:53 - Dernière réponse : gillescpp 33 Messages postés mercredi 19 février 2003Date d'inscription 22 octobre 2007 Dernière intervention
- 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
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
gillescpp 33 Messages postés mercredi 19 février 2003Date d'inscription 22 octobre 2007 Dernière intervention - 17 janv. 2007 à 08:53
3
Merci
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.

Merci gillescpp 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de gillescpp
Meilleure réponse
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 17 janv. 2007 à 18:18
3
Merci
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

Merci luhtor 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de luhtor
gillescpp 33 Messages postés mercredi 19 février 2003Date d'inscription 22 octobre 2007 Dernière intervention - 18 janv. 2007 à 08:21
0
Merci
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
Commenter la réponse de gillescpp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.