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

SDL Discussion :

[SDL][OPENGL]Problème de basculement Fenêtre<->Plein écran


Sujet :

SDL

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut [SDL][OPENGL]Problème de basculement Fenêtre<->Plein écran
    Bonjour à tous,

    je suis en train de peaufiner une source qui devrait être proposée sur developpez : un Singleton pour gérer l'affichage SDL
    http://www.developpez.net/forums/sho...d.php?t=198093

    mon Singleton initialise une fenêtre SDL pour OpenGL mais peut facilement être adapté pour du SDL pur

    j'ai inclus une méthode pour passer l'affichage courant en plein écran
    je modifie juste la présence du paramètre SDL_FULLSCREEN dans les flags passés à SDL_SetVideoMode

    Dans la FAQ de la SDL on peut lire :
    Q: Why doesn't SDL_WM_ToggleFullScreen() work on Windows?
    A: The semantics of SDL_WM_ToggleFullScreen() are that switching between fullscreen and windowed mode is transprent to the application. The display pixels pointer does not change, the display depth does not change, etc. This cannot be guaranteed on Windows. However, there is a simple method you can use to change between fullscreen and windowed mode:
    flags ^= SDL_FULLSCREEN;
    screen = SDL_SetVideoMode(..., flags);
    c'est bien la méthode conseillée et sensée fonctionner que j'utilise et pourtant ça fonctionne mal

    petite explication avec l'utilisation de ma source :
    1) je lance l'appli, avec F1,F2,F3 je change de résolution -> pas de problème
    2) je fait espace -> je passe en plein écran -> le triangle qui tourne n'apparait pas
    3) je change la résolution avec F1,F2,F3 -> le prog change de résolution en restant donc en plein écran -> le triangle réapparait
    4) je fait espace -> le prog retourne en mode fenêtre -> plus de triangle
    5) changement de résolution -> le triangle réapparait
    dans les cas de changement de résolution où je n'ai pas le triangle, même si je choisi la même résolution que l'actuelle, le triangle réapparait

    visiblement, le problème ne se pose pas sous linux
    c'est peut-etre un problème avec la carte graphique intel intégrée avec la machine que j'utilise actuellement
    si quelqu'un pouvait essayer sous windows avec une autre carte graphique

    et donc si quelqu'un a une solution à proposer pour corriger ce problème

    ps: pour ceux qui n'ont pas le courage de compiler je joint un zip avec un executable windows (nécessite SDL.DLL pour fonctionner)
    Fichiers attachés Fichiers attachés
    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.

  2. #2
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je viens de regarder ton code, il y avait déjà un problème dans l'ordre des instructions... En effet, dans ta fonction Update, il faut commencer par SDL_SetVideoMode et normalement il faut seulement mettre SDL_OPENGL et ne pas ajouter SDL_SWSURFACE...

    Je vais joindre (si cette fois-ci je le fais) la version du code qui fonctionne et j'aimerais que tu testes cette version du code, j'ai rajouter un appel à ResizeWindow lors du changement de fenêtre parce que normalement il faut réinitialiser TOUT le contexte OpenGL lors d'un appel à SDL_SetVideoMode...

    Jc
    Fichiers attachés Fichiers attachés

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    ton code fonctionne mais pose quelques soucis d'affichage lorque je passe en plein écran
    en tout cas le problème est résolu grâce à toi fearyourself, quelques explications s'imposent

    Citation Envoyé par fearyourself
    Je viens de regarder ton code, il y avait déjà un problème dans l'ordre des instructions... En effet, dans ta fonction Update, il faut commencer par SDL_SetVideoMode et normalement il faut seulement mettre SDL_OPENGL et ne pas ajouter SDL_SWSURFACE...
    Le SDL_SWSURFACE est un monumental oubli de ma part
    en fait comme je trouve beaucoup de code SDL + OpenGL qui utilisent les flags SDL_HWSURFACE j'ai fait quelques tests pour m'assurer que c'était inutile et j'ai oublié de l'enlever
    SDL_OPENGL est le seul à utiliser, combiné à SDL_FULLSCREEN pour le plein écran

    tu me dis qu'il y a un problème dans l'ordre des fonctions pourtant si je regarde la doc de SDL_GL_SetAttribute :
    http://www.libsdl.org/cgi/docwiki.cg...5fSetAttribute
    Citation Envoyé par Description
    The attributes you set don't take effect until after a call to SDL_SetVideoMode.
    visiblement je fait comme il faut et comme le montre l'exemple de la doc SDL

    j'ai donc comparé le code que tu as modifié avec le code avant modification, et comme tu dis :
    j'ai rajouter un appel à ResizeWindow lors du changement de fenêtre parce que normalement il faut réinitialiser TOUT le contexte OpenGL lors d'un appel à SDL_SetVideoMode
    en fait, tu as rajouté ResizeViewport() après le passage en plein écran pour réinitialiser le contexte OpenGL
    encore un monumental oubli de ma part

    résultat : l'oubli de ResizeViewport() est la cause du bug sous windows
    alors pourquoi ça fonctionnait sous linux, je ne sais pas
    je met la source à jour dans le forum des contributions
    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.

  4. #4
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par shenron666
    Le SDL_SWSURFACE est un monumental oubli de ma part
    en fait comme je trouve beaucoup de code SDL + OpenGL qui utilisent les flags SDL_HWSURFACE j'ai fait quelques tests pour m'assurer que c'était inutile et j'ai oublié de l'enlever
    SDL_OPENGL est le seul à utiliser, combiné à SDL_FULLSCREEN pour le plein écran
    En effet, j'ai aussi vu des gens le faire et cela n'influe pas puisque dans l'implémentation actuelle de SDL, ils ignore SDL_HWSURFACE si SDL_OPENGL est en place...

    tu me dis qu'il y a un problème dans l'ordre des fonctions pourtant si je regarde la doc de SDL_GL_SetAttribute :
    http://www.libsdl.org/cgi/docwiki.cg...5fSetAttribute

    visiblement je fait comme il faut et comme le montre l'exemple de la doc SDL
    Visibement, c'est un problème avec cette définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const int DISPLAY_ZBUFFER_DEFAULT   =       24;
    Lorsque je met 16 je n'ai pas de problème... Peut-être que si on met un entier trop grand, cela pose un problème... Pour rester le plus portable possible, ce serait sûr de simplement mettre 16...

    Je me demande pourquoi cela pose un problème avec ma carte... Par contre, j'ai rien dit, tu avais entièrement raison, il faut les placer avant.

    en fait, tu as rajouté ResizeViewport() après le passage en plein écran pour réinitialiser le contexte OpenGL encore un monumental oubli de ma part
    En effet, c'était ResizeViewport que j'ai appelé, je me suis trompé de ligne

    alors ce problème embêtant ?
    Jc

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

Discussions similaires

  1. [Batch] Fenêtre dos en plein écran
    Par gogoth62 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 26/01/2011, 21h03
  2. Ouverture fenêtre "target" en plein écran
    Par AJemni dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/02/2009, 12h58
  3. Réponses: 4
    Dernier message: 13/05/2007, 09h12
  4. fenêtre principale en plein écran
    Par didier17062006 dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/10/2006, 15h54
  5. Réponses: 4
    Dernier message: 28/05/2006, 18h01

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