IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Problème avec glGenTextures


Sujet :

OpenGL

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut Problème avec glGenTextures
    Bonjour,

    Le problème rencontré, est que lorsque je dessine un carré texturé à l'écran, celui-ci est blanc. J'ai donc un problème au niveau du texturage.

    Seulement voila, j'utilise exactement le même code et la même texture que pour un prédédent projet qui lui marche correctement, donc la je ne comprend plus tout.

    Par contre, j'ai remarqué que "glGenTextures (1, & background);" me renvoie le nombre "3131961357" alors qu'il devrait renvoyer 1 comme identifiant de texture.

    La seule différence avec le nouveau projet, c'est que la texture est stockée dans une classe qui elle même est stocké dans une autre classe, je ne sais pas si sa a quelque chose à voir...


    Pour info la hierarchie des classe est la suivante :
    Classe Engine -> Classe Game -> Classe Level -> Classe Background

    Le constructeur de Level créé une instance background contenant la texture en question et la charge.



    Voici quelques parties du code :

    Initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    	//Initialisation de SDL
        if(SDL_Init(SDL_INIT_VIDEO)!=0) {
    		cerr << "Probleme pour initialiser SDL :" << SDL_GetError() << endl;
            return EXIT_FAILURE;
        }
     
        SDL_WM_SetCaption(GAME_TITLE, NULL);									//Donne un titre à la fenêtre
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);								//Travail en double buffering
        screen = SDL_SetVideoMode(RESOLUTION_X, RESOLUTION_Y, 0, SDL_OPENGL);	//Création de la fenêtre
        if(screen==NULL)
    	{
        	cerr << "Probleme pour initialiser la fenetre SDL"  << endl;
            return EXIT_FAILURE;
    	}
     
    	//Initialisation d'OpenGL avec une vue 2d classique
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, RESOLUTION_X, RESOLUTION_Y, 0);
    La classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class cBackground
    {
    	private :
    		GLuint Tex_FrontPlan;										//Texture du 1er plan
    		//GLuint Tex_BackPlan;										//Texture du 2eme plan
     
    	public :
    		cBackground();												//Constructeur
    		~cBackground();												//Destructeur
    		void LoadBackground(string sFrontPlan, string sBackPlan);	//Charge les textures du background
    		void DrawBackground();										//Dessine le background
     
    };
    La méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    void cBackground::LoadBackground(string sFrontPlan, string sBackPlan)
    {
     
    	////////On charge la texture du 1er plan/////////////
     
    	SDL_Surface *temp;
     
    	//Paramétrage de la texture OpenGL
    	glGenTextures (1, & Tex_FrontPlan);									//Attribue un nom de texture non utilisé
        glBindTexture (GL_TEXTURE_2D, Tex_FrontPlan);						//création de la texture
     
        //Paramétrage du filtrage de la texture.
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
    	//Chargement avec SDL de la texture dans la variable temporaire
        temp = IMG_Load(sFrontPlan.c_str());
    	if(temp==NULL)
        {
            std::cerr << "Erreur dans le chargement de l'image FrontPlan de cBackground" << std::endl;
            exit(2);
        }
     
        //Jonction entre OpenGL et SDL.
        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, temp->w, temp->h, 0,
        GL_RGB, GL_UNSIGNED_BYTE, temp-> pixels);
     
    	//Libération de la texture SDL temporaire
    	SDL_FreeSurface(temp);
    }
    Lappelle de la méthode LoadBackground
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    cLevel::cLevel(int Level)
    {
     
    	//Chemin d'accés des textures du background
    	string sFrontPlan = "Medias/Backgrounds_textures/Background.png";
    	string sBackPlan = "Medias/Backgrounds_textures/Background2.png";			
    	Background = new cBackground();
    	Background->LoadBackground(sFrontPlan, sBackPlan);
     
    }
    L'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void cBackground::DrawBackground()
    {
    	//On applique la texture du 2nd plan
    	glBindTexture (GL_TEXTURE_2D, Tex_FrontPlan);
     
    	//Et on la dessine
    	glEnable(GL_TEXTURE_2D);
        glBegin(GL_QUADS);
            glTexCoord2i (0, 0) ; glVertex2i(0,0);
            glTexCoord2i (0, 1) ; glVertex2i(0,300);
            glTexCoord2i (1, 1) ; glVertex2i(300,300);
            glTexCoord2i (1, 0) ; glVertex2i(300,0);
        glEnd();
    	glDisable(GL_TEXTURE_2D);

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    tu peux essayer plusieurs choses:

    ajouter au moment de l affichage

    glTexEnv(GL_TEXTURE_ENV_MODE,GL_REPLACE)

    modifier GL_LINEAR par GL_NEAREST dasn les appels a glTexParameter

    et utiliser gluBuildMimap2D plutot que glTexImage2D

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Aucune des méthodes que tu as cité n'apportent de changement. Je ne pense pas que le problème vienne de la méthode utilisée.

    Une petite question au passage, qu'est-ce que peuvent apporter les mipmaps par rapport à glTexImage2D si je travaille exclusivement en 2d ?

  4. #4
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    ca resemble fortement à un appel a glGenTexture alors que le context openGL n'est pas initialisé tout ca
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    si les mipmaps ne sont pas initialise, et que tu les utilisent, alors tu as le plus souvent un affichage monocolore blanc ou noir.

    je crois que le contexte non initialise dont par bafman est effectivement peut etre bien la source du probleme

  6. #6
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    généralement, quand glGenTexture retourne un Id completement delirant, c'est que le context n'a pas été créer (bien que la valeur de l'Id soit lié à l'implementation et puisse donc être completement aleatoire)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par bafman
    généralement, quand glGenTexture retourne un Id completement delirant, c'est que le context n'a pas été créer (bien que la valeur de l'Id soit lié à l'implementation et puisse donc être completement aleatoire)
    Clairement vu que la fonction qui appelle glGenTexture est appellée depuis un constructeur...

    Jc

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    généralement, quand glGenTexture retourne un Id completement delirant, c'est que le context n'a pas été créer (bien que la valeur de l'Id soit lié à l'implementation et puisse donc être completement aleatoire)
    Poutant j'ai bien placé la partie initialisation dans la fonction main et il me semble ne rien y manquer.

    Clairement vu que la fonction qui appelle glGenTexture est appellée depuis un constructeur...
    Je ne suis pas sur de saisir, ça pose un problème ou pas ?

  9. #9
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    si l'objet qui fait appel a glGenTexture (ici cLevel) est déclaré en global par exemple, le constructeur va être appelé avant le main, donc problème.
    de maniere général, placer du code lié a l'API dans un constructeur est potentiellement générateur de problèmes
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si tes instances sont déclarées en global elles vont être construites avant l'entrée dans le main, donc avant l'initialisation d'OpenGL.

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Oups, oui vous avez tout-à-fait raison.

    Au début j'avais fais une fonction qu'il fallait appeller séparément pour commencer dans le jeu, le menu ou l'éditeur, et puis comme pour l'instant je commence juste à créer la partie jeu, je l'avais placé temporairement dans le constructeur pour y aller directement.
    J'ai un peu honte de ne pas avoir vu cette erreur.

    Je vous remercie tous pour m'avoir aidé à résoudre ce problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo