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 :

[SDL - OpenGL] Redimensionner une fenetre


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut [SDL - OpenGL] Redimensionner une fenetre
    Bonjour à tous,

    Je me suis interressé à essayer de redimensionner ma fenetre, dans laquelle j'ai une scene avec des cubes et un sol affiché par VBO.

    Pour redimensionner une fenêtre j'apelle ma fonction de redimensionnement :

    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
     
    SDL_Surface * screen= NULL;
     
    ...
     
    bool redimensionnerFenetre(int largeur, int hauteur)
    {
        Largeur  = largeur;
        Hauteur = hauteur;
    	screen = SDL_SetVideoMode(largeur, hauteur, SCREEN_DEPTH, VideoFlags);
     
    	majViewport(largeur, hauteur);
     
        return true;
    }
    Mais là plantage à l'affichage de la scène.

    L'affichage ne fonctionne correctement que si je détruit les objets de ma scène puis les reconstruit.

    Est ce normal? y a t il un moyen de ne pas pas réinitialiser tous les objets de la scène?

    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut,

    dans ton VideoFlag, SDL_RESIZABLE est il bien activé ?
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    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 tu utilise des VBO et autre "truc" dans le genre, ça peut être normal. Enfin bon, un crash n'est jamais normale, mais il faut savoir que le redimensionnement détruit ta fenêtre pour en recréer une nouvelle, du coup, tu perd ton contexte openGL, et tu doit recharger toutes les données après le redimensionnement. (d'ailleurs, tu devrait aussi des décharger avant histoire d'eviter de mettre le driver dans une situation délicate)
    * 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

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut
    Merci de vos réponses

    dans ton VideoFlag, SDL_RESIZABLE est il bien activé ?
    oui, il est bien activé, mais en fait la "trace" laissé par le redimensionnement m'agaçait quelque peu. Et d'autre part je voulais pouvoir ensuite faire des changement de résolutions et faire un switch de redimensionnement fenetré<->fullscreen.

    si tu utilise des VBO et autre "truc" dans le genre, ça peut être normal. Enfin bon, un crash n'est jamais normale, mais il faut savoir que le redimensionnement détruit ta fenêtre pour en recréer une nouvelle, du coup, tu perd ton contexte openGL, et tu doit recharger toutes les données après le redimensionnement. (d'ailleurs, tu devrait aussi des décharger avant histoire d'eviter de mettre le driver dans une situation délicate)
    oui, je me suis aperçu qu'il y avait destruction du contexte openGL puisque si je ne fais que réinitialiser mes VBO pas de plantage mais la lumière était à nouveau celle par défaut.

    Donc pas besoin de détruire les objets pour tout reconstruire, il faut juste réinitialiser le contexte OpenGL, réinitialiser les VBO et les textures.

    Une dernière question par :
    (d'ailleurs, tu devrait aussi des décharger avant histoire d'eviter de mettre le driver dans une situation délicate)
    tu veux dire effacer les buffers et texture en mémoire avant de réinitialiser, comme suit?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void CObjet::ReInitObjet()
    {
    	glDeleteBuffers(1, &ArrayBuffer);
    	glDeleteBuffers(1, &IndiceBuffer);
    	InitVBO();
    	glDeleteTextures(1, &Texture ); 
    	InitTexture("images/textures/maTexure.jpg");
    }

  5. #5
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Citation Envoyé par Naelhem Voir le message
    Une dernière question par :
    (d'ailleurs, tu devrait aussi des décharger avant histoire d'eviter de mettre le driver dans une situation délicate)
    tu veux dire effacer les buffers et texture en mémoire avant de réinitialiser, comme suit?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void CObjet::ReInitObjet()
    {
    	glDeleteBuffers(1, &ArrayBuffer);
    	glDeleteBuffers(1, &IndiceBuffer);
    	InitVBO();
    	glDeleteTextures(1, &Texture ); 
    	InitTexture("images/textures/maTexure.jpg");
    }
    non, bafman voulait dire, avant de "perdre" ton contexte, supprimer tout ce qui est lié à lui (VBO, textures, ect)

    ce que tu fais dans ton exemple, c'est détruire ce que tu as déjà perdu, normalement ça ne te fait pas planter, par contre ça doit génèrer des erreurs opengl

    donc pour résumer, redimensionnement de fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    destruction des resources liées au contexte
    destruction du contexte
    création d'un nouveau contexte
    restitution des resources
    au possibilité, à tester, je pense que ça fonctionne : le partage de contexte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    création du nouveau contexte
    partage des resources entre l'ancien et le nouveau contexte
    destruction de l'ancien contexte
    voir une autre discussion dans le forum sur le sujet (partage de contexte)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut


    parfois ma bêtise me fait peur.

    oui effectivement je détruit ce qui l'est déjà

    Encore un grand merci pour vos explications. Tout fonctionne à merveille, maintenant.

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

Discussions similaires

  1. Redimensionner une fenetre
    Par trikker dans le forum Débuter
    Réponses: 2
    Dernier message: 22/06/2009, 13h22
  2. Positionner et redimensionner une fenetre d'un exécutable
    Par cquadjul dans le forum C++Builder
    Réponses: 1
    Dernier message: 07/08/2006, 16h15
  3. Réponses: 3
    Dernier message: 26/04/2006, 11h13
  4. redimensionner une fenetre
    Par iamhere dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/04/2006, 22h02
  5. afficher de l'opengl dans une fenetre web
    Par soubre dans le forum OpenGL
    Réponses: 7
    Dernier message: 16/09/2005, 18h16

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