【问题标题】:Is there a way to toggle fullscreen without destroying window/context? [duplicate]有没有办法在不破坏窗口/上下文的情况下切换全屏? [复制]
【发布时间】:2018-05-17 10:59:00
【问题描述】:

我目前有一个使用 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();
    }
}

【问题讨论】:

  • 啊,这个答案比我提供的要广泛得多。就个人而言,我认为 GLFW 在这方面很糟糕,SDL2 为您提供了 SDL_SetWindowFullscreen() 功能,它只是做正确的事情。 GLFW 的 glfwSetWindowMonitor() 将切换全屏与调整窗口大小和定位相结合。

标签: c++ opengl fullscreen glfw windowed


【解决方案1】:

根据 GLFW 的文档,您可以使用函数glfwSetWindowMonitor() 来切换现有窗口的全屏模式,而无需销毁并重新创建它。

以下命令将根据_fullscreen 变量更改全屏状态:

glfwSetWindowMonitor(window, _fullscreen ? glfwGetPrimaryMonitor() : NULL, 0, 0, _width, _height, GLFW_DONT_CARE);

【讨论】:

  • 非常感谢,我第一次红文档时没有得到函数的范围,但是当你提到它时,我去了函数本身的规范,一切都是水晶现在清楚了。我已经尝试过您的解决方案,它可以完美运行
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多