有没有办法在不破坏 window/context 的情况下切换全屏?
Is there a way to toggle fullscreen without destroying window/context?
我目前有一款 OGL 4.5 和 GLFW 3 游戏。
我正在尝试制作一个允许在全屏和 windowed 模式之间切换的功能。然而,似乎为了实现这一点,我必须销毁当前的 window 然后在同一指针中创建一个新的(我在 GLFW 文档中将其标红)。
虽然这可行并且我可以在两种模式之间切换,但一旦切换发生,它会导致引擎的一些关键部分停止绘制。
因此,我想知道是否有某种方法可以在不破坏 window 并创建新的情况下启用/禁用全屏。
这是函数的代码:
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 的文档,您可以使用函数 glfwSetWindowMonitor()
切换现有 window 的全屏模式,而无需销毁并重新创建它。
以下命令将根据 _fullscreen
变量更改全屏状态:
glfwSetWindowMonitor(window, _fullscreen ? glfwGetPrimaryMonitor() : NULL, 0, 0, _width, _height, GLFW_DONT_CARE);
我目前有一款 OGL 4.5 和 GLFW 3 游戏。
我正在尝试制作一个允许在全屏和 windowed 模式之间切换的功能。然而,似乎为了实现这一点,我必须销毁当前的 window 然后在同一指针中创建一个新的(我在 GLFW 文档中将其标红)。
虽然这可行并且我可以在两种模式之间切换,但一旦切换发生,它会导致引擎的一些关键部分停止绘制。
因此,我想知道是否有某种方法可以在不破坏 window 并创建新的情况下启用/禁用全屏。
这是函数的代码:
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 的文档,您可以使用函数 glfwSetWindowMonitor()
切换现有 window 的全屏模式,而无需销毁并重新创建它。
以下命令将根据 _fullscreen
变量更改全屏状态:
glfwSetWindowMonitor(window, _fullscreen ? glfwGetPrimaryMonitor() : NULL, 0, 0, _width, _height, GLFW_DONT_CARE);