Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: OpenGL ne fonctionne plus après avoir recréé une fenêtre  (Lu 2321 fois)

0 Membres et 1 Invité sur ce sujet

herotom99

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
OpenGL ne fonctionne plus après avoir recréé une fenêtre
« le: Juillet 26, 2016, 05:30:49 pm »
Bonjour,

But:
J'essaie d'implémenter dans mon moteur la possibilité de passer en mode pleine écran.

Problème rencontré:
Le rendu d'origine (première création de la fenêtre) fonctionne parfaitement, en revanche lorsque je change d'état en récréant la fenêtre (RenderWindow.create) les fonctions d'OpenGL modern ne fonctionne plus (avec glGetError j'obtiens: "Unknow error") et j'obtiens juste le background avec la couleur correspondante.
Je parle bien de fonctions modern parce que par exemple glClearColor fonctionne.

Je précise que j'ai vérifié le reste du programme et les fonctions Init et ReInit sont bien appelées et que le reste du moteur s'update correctement (coordonnées des objets s'actualisent etc...)
=>Tout fonctionne sauf le rendu. :-\


 Fonction Init (lors du lancement du moteur):
//Setup settings for window
        m_settings = sf::ContextSettings();
        m_settings.depthBits = 24;
        m_settings.stencilBits = 8;
        m_settings.majorVersion = 4;
        m_settings.minorVersion = 0;
        m_settings.antialiasingLevel = m_winsettings.AntiAliasingLevel;

        m_window.create(sf::VideoMode(m_winsettings.Size.x, m_winsettings.Size.y, 32), GetGame()->GetName(), m_winsettings.Style, m_settings);
        m_window.setFramerateLimit(m_winsettings.FrameLimit);
        m_window.setVerticalSyncEnabled(m_winsettings.UseSynchronisation);
        m_window.setKeyRepeatEnabled(true);

        //CenterScreen
        m_centerscreen.x = m_winsettings.Size.x / 2.0f + m_window.getPosition().x;
        m_centerscreen.y = m_winsettings.Size.y / 2.0f + m_window.getPosition().y;

        //Init glew
        glewExperimental = GL_TRUE;
        glewInit();

        //OpenGl settings
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_STENCIL_TEST);
        glDepthFunc(GL_LESS);

        glDisable(GL_CULL_FACE);
        //glEnable(GL_CULL_FACE);
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

Fonction ToggleScreen (appelée pour changer d'état):
if (m_winsettings.Style == sf::Style::Fullscreen)
        {
                m_winsettings.Style = sf::Style::Close;
                m_window.create(sf::VideoMode(m_winsettings.Size.x, m_winsettings.Size.y, 32), GetGame()->GetName(), m_winsettings.Style, m_settings);
        }
        else
        {
          m_winsettings.Style = sf::Style::Fullscreen;
                m_window.create(sf::VideoMode(m_winsettings.Size.x, m_winsettings.Size.y, 32), GetGame()->GetName(), m_winsettings.Style, m_settings);
        }
               
        ReInit();

Et la fonction ReInit (appelée pour "Update" l'état du rendu):
//OpenGl settings
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_STENCIL_TEST);
        glDepthFunc(GL_LESS);
        glDisable(GL_CULL_FACE);
        glClearColor(0.1f, 0.1f, 0.1f, 1.0f);

        m_window.setFramerateLimit(m_winsettings.FrameLimit);
        m_window.setVerticalSyncEnabled(m_winsettings.UseSynchronisation);
        m_window.setKeyRepeatEnabled(true);

        m_window.setActive();

        glViewport(0, 0, m_window.getSize().x, m_window.getSize().y);

        m_centerscreen.x = m_window.getPosition().x + m_window.getSize().x / 2.0f;
        m_centerscreen.y = m_window.getPosition().y + m_window.getSize().y / 2.0f;

        GetGame()->GetEvent()->ReInit();

Merci pour votre aide !

 

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
« Réponse #1 le: Juillet 26, 2016, 06:14:47 pm »
Si tu utilises des VAO il faut les recréer.

herotom99

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
« Réponse #2 le: Juillet 26, 2016, 06:28:45 pm »
Ok ça fonctionne, merci pour ta réponse rapide. Par contre je vois vraiment pas pourquoi les VAO sont détruites... Est ce que c'est la même chose pour les VBO et en fait tout est clean sur la VRAM ?

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
« Réponse #3 le: Juillet 26, 2016, 07:56:22 pm »
https://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object
Citer
Note: VAOs cannot be shared between OpenGL contexts.

Quand tu recrées la fenêtre ça recrée un contexte OpenGL, donc obligé de refaire tes VAO. Pour les VBO c'est bon je crois.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
« Réponse #4 le: Juillet 26, 2016, 08:32:23 pm »
Oui, les VAO ne sont pas partagés donc ils sont détruits avec le contexte. Pour le reste c'est bon en effet.
Laurent Gomila - SFML developer

herotom99

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
« Réponse #5 le: Juillet 26, 2016, 08:48:01 pm »
C'est bon j'ai testé plusieurs combinaisons et il y a juste besoin de reupload les VAO (pour les VBO pas besoin).
Voilà merci pour votre aide.