Есть ли способ переключить полноэкранный режим без разрушения окна / контекста?
У меня сейчас игра с 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);