Opengl 在不破坏上下文的情况下重新创建窗口

Opengl 在不破坏上下文的情况下重新创建窗口,opengl,graphics,window,cross-platform,fullscreen,Opengl,Graphics,Window,Cross Platform,Fullscreen,这个问题是关于使用OpenGL的图形应用程序的。(当时我正在使用GLFW框架,但我考虑改变它) 我的目标是让用户(尽可能)在全屏模式和窗口模式之间不断切换。此过程应不到一秒钟,并且可以在运行时发生。例如,查看Minecraft游戏,在该游戏中,用户可以毫无延迟地切换全屏 窗口重新创建过程不会花费太多时间。但问题是,关闭窗口会破坏我的OpenGL上下文,我必须重新加载所有着色器和缓冲区 如何在不破坏OpenGL上下文的情况下重新创建图形应用程序的窗口?(我想使用GLFW,但我对替代框架或自己的实现

这个问题是关于使用OpenGL的图形应用程序的。(当时我正在使用GLFW框架,但我考虑改变它)

我的目标是让用户(尽可能)在全屏模式和窗口模式之间不断切换。此过程应不到一秒钟,并且可以在运行时发生。例如,查看Minecraft游戏,在该游戏中,用户可以毫无延迟地切换全屏

窗口重新创建过程不会花费太多时间。但问题是,关闭窗口会破坏我的OpenGL上下文,我必须重新加载所有着色器和缓冲区


如何在不破坏OpenGL上下文的情况下重新创建图形应用程序的窗口?(我想使用GLFW,但我对替代框架或自己的实现持开放态度。)

从技术上讲,OpenGL上下文不与任何窗口绑定。重要的是,窗口的视觉格式与为其创建上下文的视觉格式相匹配。在多个窗口中使用单个OpenGL上下文是完全可能的

您面临的问题是,像GLFW、SDL或GLUT这样的框架没有公开这种功能。这是一个功能,一定要添加到他们的一些时间

但是,当您自己创建和管理windows和OpenGL上下文时,您可以这样做。你打算做什么的主要过程如下:

  • 选择windows的可视格式(PIXELFORMATDESCRIPTOR、visual、FBConfig,具体取决于操作系统和图形系统)

  • 创建第一个窗口并设置视觉格式

  • 创建与第一个窗口相关的可绘制OpenGL上下文

  • 创建更多窗口,并将其设置为与您已选择的视觉格式完全相同的格式


  • 现在,您可以将OpenGL上下文与其当前可绘制(=窗口)分离,并将其附加到具有兼容视觉格式的任何其他可绘制(即窗口)

    从技术上讲,OpenGL上下文不绑定到任何窗口。重要的是,窗口的视觉格式与为其创建上下文的视觉格式相匹配。在多个窗口中使用单个OpenGL上下文是完全可能的

    您面临的问题是,像GLFW、SDL或GLUT这样的框架没有公开这种功能。这是一个功能,一定要添加到他们的一些时间

    但是,当您自己创建和管理windows和OpenGL上下文时,您可以这样做。你打算做什么的主要过程如下:

  • 选择windows的可视格式(PIXELFORMATDESCRIPTOR、visual、FBConfig,具体取决于操作系统和图形系统)

  • 创建第一个窗口并设置视觉格式

  • 创建与第一个窗口相关的可绘制OpenGL上下文

  • 创建更多窗口,并将其设置为与您已选择的视觉格式完全相同的格式


  • 现在,您可以将OpenGL上下文与其当前可绘制(=窗口)分离,并将其附加到具有兼容视觉格式的任何其他可绘制(即窗口)

    是的,这就是我要找的。有什么框架可以帮助我吗?我自己不想为跨平台而挣扎。但由于我的窗口不使用按钮或标签之类的控件,像Qt或wxWidgets这样的库似乎太重了。@sharethis:我所知道的都不是轻量级的。我认为最好的做法是将此功能添加到GLFW并将其贡献到项目中。当然,问题是,为什么要首先使用GLFW重新创建窗口。我刚开始使用GLFW,但我没有决定在讨论的任务中仍然使用此框架。还有更好的办法吗?然后我将面对GLFW。@sharethis:嗯,GLFW是一个很好的框架。我想知道的是,为什么你要关闭窗口并打开另一个窗口?这是因为(我悲哀地认为)我必须这样做才能切换全屏模式。我不知道有什么功能可以在GLFW中将现有窗口更改为全屏或窗口模式。是的,这就是我要找的。有什么框架可以帮助我吗?我自己不想为跨平台而挣扎。但由于我的窗口不使用按钮或标签之类的控件,像Qt或wxWidgets这样的库似乎太重了。@sharethis:我所知道的都不是轻量级的。我认为最好的做法是将此功能添加到GLFW并将其贡献到项目中。当然,问题是,为什么要首先使用GLFW重新创建窗口。我刚开始使用GLFW,但我没有决定在讨论的任务中仍然使用此框架。还有更好的办法吗?然后我将面对GLFW。@sharethis:嗯,GLFW是一个很好的框架。我想知道的是,为什么你要关闭窗口并打开另一个窗口?这是因为(我悲哀地认为)我必须这样做才能切换全屏模式。我不知道如何在GLFW中将现有窗口更改为全屏或窗口模式。我将查看库。它让我能够独立访问windows和上下文。也许这正是我需要的。我会去图书馆看看。它让我能够独立访问windows和上下文。也许这正是我需要的。