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 :

Charger une texture dans le constructeur de ma classe = impossible?


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de benjani13
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2010
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2010
    Messages : 616
    Par défaut Charger une texture dans le constructeur de ma classe = impossible?
    Bonjour, j'aurais besoin de votre aide pour un petit problème. J'ai créer une class Scene, qui s'occupe juste de dessiner la scene (pour ne pas encombrer le main), voici son prototype:
    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
    #ifndef DEF_DRAW
    #define DEF_DRAW
     
        class Scene
        {
            public:
                Scene();
                ~Scene();
                void drawAll();
     
            private:
                GLuint m_textureSol;
        };
     
    #endif
    Et le .cpp qui va avec:
    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
    34
    35
    36
    #include <SDL/SDL.h>
    #include <SDL_image.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
     
    #include "constantes.h"
    #include "sdlglutils.h"
    #include "Scene.h"
     
    Scene::Scene()
    {
        m_textureSol = loadTexture("textures/metal091.JPG");
    }
     
    Scene::~Scene()
    {
        glDeleteTextures(1, &m_textureSol);
    }
     
    void Scene::drawAll()
    {
        glBindTexture(GL_TEXTURE_2D, m_textureSol);
     
        glBegin(GL_QUADS);
     
        glTexCoord2d(-10, -10);
        glVertex3d(-10, -10, 0);
        glTexCoord2d(-10, 10);
        glVertex3d(-10, 10, 0);
        glTexCoord2d(10, 10);
        glVertex3d(10, 10, 0);
        glTexCoord2d(10, -10);
        glVertex3d(10, -10, 0);
     
        glEnd();
    }
    Et mon main:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <SDL/SDL.h>
    #include <SDL_image.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
     
    #include "constantes.h"
    #include "Scene.h"
    #include "event.h"
    #include "sdlglutils.h"
     
    int main ( int argc, char** argv )
    {
        SDL_Surface *ecran = NULL;
        Input in;
        Scene scene;
        double camX = 3, camY = 3, camZ = 1;
        double cibleX = 0, cibleY = 0, cibleZ = 0;
     
        memset(&in, 0, sizeof(in));
     
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_OPENGL);
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(70, (double)LARGEUR_FENETRE / HAUTEUR_FENETRE, 1, 1000);
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_DEPTH_TEST);
     
        while(!(in.quit) && !(in.key[SDLK_ESCAPE]))
        {
            updateEvent(&in);
     
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
     
            gluLookAt(camX, camY, camZ, cibleX, cibleY, cibleZ, 0, 0, 1);
     
            scene.drawAll();
     
            glFlush();
            SDL_GL_SwapBuffers();
        }
     
        return 0;
    }
    La fonction "loadTexture()" charge une texture OpenGL a partir d'une SDL_Surface.
    Le problème est que lorsque je charge la texture dans le constructeur de la classe, la texture n'apparait pas dans ma scene(ici je n'ai fais que le sol pour tester), par contre si je la charge dans la fonction "drawAll()", cela marche.
    Mais si je fais comme sa je dois charger puis détruire mes textures a chaque appelle de la fonction donc c'est pas super.

    J'aimerais donc savoir si c'est bien possible de charger une texture dans le constructeur, et si oui quel est mon erreur.

    Merci beaucoup si vous pouvez m'aider .

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Bonjour,

    je ne pourrai pas te donner de détails concernant SDL (que je n'ai jamais utilisé...), mais là a priori le problème c que tu essaies de charger des textures avant d'avoir créé une contexte OpenGL.

    Plus précisément, quand tu écris:
    Tu crées une Scene, donc tu appelles le constructeur de Scene, qui essaie de charger la texture.

    ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      SDL_Init(SDL_INIT_VIDEO);
    ne vient que par après, et je suppose que c là qu'est créé ton contexte OpenGL.

    Donc:
    - soit tu crées ton objet Scene apres l'initialisation
    - soit tu ajoutes une fonction Scene::Init() pour charger les textures, et tu appelles cette fonction apres le SDL init (Je te conseille plutôt cette variante, quitte a appeler Init dans ton constructeur, si vraiment tu veux que ca marche comme ca. en gros c toujours bien de séparer les fonctionnalités dans diverses fonctions afin de pouvoir les appeler chacune au moment le plus opportun)

  3. #3
    Membre éprouvé
    Avatar de benjani13
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2010
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2010
    Messages : 616
    Par défaut
    A oui sa doit être sa. Je n'avais pas penser que en faisant comme sa je chargeais la texture avant d'avoir charger SDL/OpenGL. Effectivement je vais pencher pour la seconde solution.

    Merci beaucoup pour ton aide.

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

Discussions similaires

  1. [javascript]charger une page dans une cellule
    Par Destampy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/05/2005, 17h21
  2. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56
  3. charger une scene dans la memoire de la carte video
    Par Arnaudv6 dans le forum OpenGL
    Réponses: 10
    Dernier message: 11/09/2004, 01h44
  4. Copier une texture dans une autre?
    Par supergrey dans le forum DirectX
    Réponses: 9
    Dernier message: 28/07/2004, 11h12
  5. [ServletContext]Charger une ressource dans la servletContext
    Par lalou33 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 25/06/2004, 14h37

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