2

I have a fully working engine that is using SDL and OpenGL. I have a textured box on my OpenGL/SDL screen - however when I try to change the video mode (e.g. toggle fullscreen with F11) the texturing is lost (the box is just plain white), if I toggle back to windowed mode the box is still white (with the textured image lost). Does this mean I cannot change my video mode in the middle of the application (e.g. toggle fullscreen) or does it mean I have to reload my OGL textures every time I do so?

Some extra notes: I am using CodeBlocks with MinGW on windows 7, the libraries I have linked are: SOIL (a library for easily loading textures in OGL - http://www.lonesock.net/soil.html), OpenGL32, Glu32 and SDL.

I have some images to demonstrate my problem (the first one is windowed mode and the second one is when I try to change to fullscreen with a call to SDL_SetVideoMode(...) - SDL_WM_ToggleFullScreen doesn't work.

Windowed mode (this is how I want it to look):

Fullscreen mode (the texturing is lost!!!):

4

2 回答 2

2

我的 OpenGL/SDL 屏幕上有一个带纹理的框 - 但是当我尝试更改视频模式(例如,使用 F11 切换全屏)时,如果我切换回窗口模式,则纹理会丢失(框只是纯白色)仍然是白色的(纹理图像丢失)。这是否意味着我无法在应用程序中间更改我的视频模式(例如切换全屏),还是意味着我每次这样做时都必须重新加载我的 OGL 纹理?

这在很大程度上取决于所使用的框架如何实现视频模式更改。

一般来说,当删除一个 OpenGL 上下文时,所有相关的数据都会丢失,除非有另一个 OpenGL 上下文已经建立了“共享”。这可用于在上下文重新创建之间保持所有上传的数据持久。然而,单纯的视频模式更改通常不需要重新创建上下文,通常也不需要重新创建窗口。

但是,您使用的框架 (SDL) 将在更改视频模式时完全清理窗口和上下文,从而丢失您加载的资源。SDL 的不稳定开发版本具有更好的 OpenGL 支持,允许视频模式更改而无需在其间进行上下文拆解。

于 2013-06-09T10:29:05.403 回答
1

不幸的是,问题源于 SDL 重新创建窗口的方式。我之前遇到过这个问题,我的解决方案是设置一个特殊的取消初始化和初始化函数,它只删除/创建的图像。

本质上,当调用 SDL 的 Resize 事件 ( http://www.libsdl.org/docs/html/sdlresizeevent.html ) 时,您将取消初始化任何所需的艺术资产,然后在进入或离开全屏后重新初始化它们。

于 2013-06-09T12:15:37.177 回答