Forum de la communauté SFML

Aide => Général => Discussion démarrée par: herotom99 le Juillet 26, 2016, 05:30:49 pm

Titre: OpenGL ne fonctionne plus après avoir recréé une fenêtre
Posté par: herotom99 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 !

 
Titre: Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
Posté par: G. le Juillet 26, 2016, 06:14:47 pm
Si tu utilises des VAO il faut les recréer.
Titre: Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
Posté par: herotom99 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 ?
Titre: Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
Posté par: G. 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.
Titre: Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
Posté par: Laurent 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.
Titre: Re : OpenGL ne fonctionne plus après avoir recréé une fenêtre
Posté par: herotom99 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.