我有一个使用SDL和OpenGL的全功能引擎。我的OpenGL / SDL屏幕上有一个带纹理的盒子 - 但是当我尝试更改视频模式时(例如用F11切换全屏)纹理会丢失(盒子只是纯白色),如果我切换回窗口模式盒子仍然是白色(纹理图像丢失)。这是否意味着我无法在应用程序中间更改我的视频模式(例如切换全屏)或者这是否意味着每次我都要重新加载我的OGL纹理?
一些额外的注意事项:我在Windows 7上使用带有MinGW的CodeBlocks,我链接的库是:SOIL(用于在OGL中轻松加载纹理的库 - http://www.lonesock.net/soil.html),OpenGL32,Glu32和SDL。
我有一些图像来演示我的问题(第一个是窗口模式,第二个是当我尝试通过调用SDL_SetVideoMode(...)更改为全屏时 - SDL_WM_ToggleFullScreen不不行。
答案 0 :(得分:2)
我的OpenGL / SDL屏幕上有一个纹理框 - 但是当我尝试更改视频模式时(例如,使用F11切换全屏)纹理会丢失(框只是纯白色),如果我切换回窗口模式框仍然是白色(纹理图像丢失)。这是否意味着我无法在应用程序中间更改我的视频模式(例如切换全屏)或者这是否意味着每次我都要重新加载我的OGL纹理?
这在很大程度上取决于所使用的框架如何实现视频模式的更改。
一般情况下,当删除OpenGL上下文时,所有相关的数据都会丢失,除了,如果有另一个OpenGL上下文已经建立了“共享”。这可以用于在上下文重新创建之间保持所有上载的数据。然而,仅仅视频模式改变通常不需要上下文娱乐,并且通常也不需要窗口娱乐。
但是,您使用的框架(SDL)将在更改视频模式时完全清理窗口和上下文,从而使您失去加载的资源。 SDL的不稳定开发版本具有更好的OpenGL支持,允许视频模式更改,而不会在上下文中进行上下文拆分。
答案 1 :(得分:1)
不幸的是,问题源于SDL重新创建窗口的方式。之前我遇到过这个问题,我的解决方案是设置一个特殊的uninitialize和initialize函数,只删除/创建图像。
基本上,当调用SDL的Resize事件(http://www.libsdl.org/docs/html/sdlresizeevent.html)时,您将取消初始化所需的任何艺术资产,然后在进入或离开全屏后重新初始化它们。