我们有一个OpenGL应用程序(使用Ogre3d和SDL,而不是直接调用OpenGL),我们正在尝试在运行时更改分辨率。似乎我们需要使用新的分辨率重新初始化我们的OpenGL上下文,但是许多项目正在打破。在Linux上它似乎工作了一段时间,然后我们在屏幕上得到图形损坏。在Windows上,它只是在我们下次尝试渲染帧时崩溃。我们已经强制在Ogre中重新加载纹理,如果我们只渲染纹理(没有3d模型),那么这样可以正常工作,但任何3d模型都会导致崩溃并重新加载,然后再渲染它们。
以下链接深入解释我们正在进行的Ogre3d调用:http://www.ogre3d.org/forums/viewtopic.php?f=2&t=62825
我们真正需要知道的是,在重新初始化Opengl上下文时需要恢复哪些资源?
为什么调整OpenGL上下文会影响其他资源?它是OpenGL的工作方式,还是我们使用的其中一个库引入了这个问题?我们可以在不知情的情况下添加此问题吗?
答案 0 :(得分:1)
你看过this forum thread吗?
SDL似乎在更改分辨率时会破坏OpenGL。在这种情况下,所有您的GL资源将被上下文销毁。
一种可能的解决方案是创建另一个“虚拟”GL上下文,与“真实”GL上下文共享资源,并通过SDL保持活动状态破坏“主要”上下文。这样你的大部分资源都可以存活下来。
请注意,某些资源无法共享,纹理和VBO都可以,但VAO不能。
答案 1 :(得分:1)
OpenGL支持在表面代码建立后添加了SDL。这就是为什么改变SDL窗口的大小是破坏性的。您被指向OpenGL上下文共享及其警告。但是,通过不使用SDL创建OpenGL窗口,我完全避免了这个问题。您可以使用SDL提供的所有其他工具,而无需由SDL管理的窗口,因此唯一可以改变的是输入事件处理以及窗口的创建方式。而不是SDL我会使用GLFW,就像SDL要求你实现自己的事件处理循环一样,因此使用GLFW作为OpenGL窗口和上下文创建的直接替代是很简单的。