1

我们有一个 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 的工作方式,还是我们使用的库之一引入了这个问题?我们可以在不知情的情况下添加这个问题吗?

4

2 回答 2

1

你看过这个论坛帖子吗?

更改分辨率时,SDL 似乎会破坏 OpenGL。在这种情况下,所有GL 资源都会随上下文一起销毁。

一种可能的解决方案是创建另一个“虚拟”GL 上下文,与您的“真实”GL 上下文共享资源,并通过 SDL 保持其活动状态会破坏“主要”上下文。这样,您的大部分资源都应该存在。

注意有些资源不能共享,贴图和VBO都可以,但是VAO不行。

于 2011-02-03T07:18:15.000 回答
1

OpenGL 支持是在其表面代码建立后添加的 SDL。这就是为什么改变 SDL 窗口的大小是具有破坏性的。您被指出 OpenGL 上下文共享及其注意事项。但是,我会通过不使用 SDL 创建 OpenGL 窗口来完全避免这个问题。您可以在没有由 SDL 管理的窗口的情况下使用 SDL 提供的所有其他工具,因此唯一会改变的是输入事件处理和窗口的创建方式。我会使用 GLFW 而不是 SDL,它与 SDL 一样需要您实现自己的事件处理循环,因此使用 GLFW 作为 OpenGL 窗口和上下文创建的替代品非常简单。

于 2011-02-03T11:21:50.460 回答