Есть ли способ переключить полноэкранный режим без разрушения окна / контекста?

У меня сейчас игра с OGL 4.5 и GLFW 3.

Я пытаюсь сделать функцию, которая позволяет переключаться между полноэкранным и оконным режимами. Тем не менее, кажется, что для этого я должен уничтожить текущее окно и затем создать новое с тем же указателем (я выделил это красным в документации GLFW).

Хотя это работает, и я могу переключаться между двумя режимами, это приводит к тому, что некоторые важные части двигателя перестают рисовать, когда происходит своп.

В связи с этим хотелось бы узнать, есть ли какой-нибудь способ включить / отключить полноэкранный режим, не разрушая окно и не создавая новое.

Это код функции:

void TMooseEngine::toggleFullscreen()
{
    _fullscreen = !_fullscreen;

    glfwDestroyWindow(window);
    delete _shader;
    delete _skybox;
    //delete _particulas;




    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    if(_fullscreen){ //change to fullscreen
       window = glfwCreateWindow(_width, _height, "Fate Warriors", glfwGetPrimaryMonitor(), NULL);
       glfwMakeContextCurrent(window);
       glViewport(0,0,_width,_height);
       //culling
       glEnable(GL_DEPTH_TEST);
       glViewport(0,0,_width,_height);
       glEnable(GL_CULL_FACE);
       glCullFace(GL_BACK); 
       glFrontFace(GL_CCW);
       _shader = new Shader();
       _skybox = new Skybox();

       initUI();
    }

    else{ //change to windowed
        window = glfwCreateWindow(_width, _height, "Fate Warriors", NULL, NULL);
        glfwMakeContextCurrent(window);
        glViewport(0,0,_width,_height);
        //culling
        glEnable(GL_DEPTH_TEST);
        glViewport(0,0,_width,_height);
        glEnable(GL_CULL_FACE);
        glCullFace(GL_BACK); 
        glFrontFace(GL_CCW);
        _shader = new Shader();
        _skybox = new Skybox();

        initUI();
    }
}

1 ответ

Решение

Согласно документации GLFW, вы можете использовать функцию glfwSetWindowMonitor() переключать полноэкранный режим существующего окна, не разрушая и не воссоздавая его.

Следующая команда изменит статус полноэкранного режима в зависимости от _fullscreen переменная:

glfwSetWindowMonitor(window, _fullscreen ? glfwGetPrimaryMonitor() : NULL, 0, 0, _width, _height, GLFW_DONT_CARE);
Другие вопросы по тегам