如何使用SDL 1.3在Mac OSX上切换全屏以使其实际工作?

时间:2012-01-08 08:24:05

标签: macos opengl toggle sdl fullscreen

SDL_WM_ToggleFullScreen。然而,在Mac上,它的实现破坏了OpenGL上下文,它会破坏你的纹理。好的,很烦人,但我可以重新加载我的纹理。但是,当我在切换后重新加载纹理时,它会在由memcpy调用的glTexImage2D内的某些纹理上崩溃。嗯,当我第一次加载这些纹理时,它确实没有崩溃。我甚至尝试在切换之前删除所有纹理,但我得到了相同的结果。

作为测试,我重新加载纹理而不切换全屏,纹理重新加载很好。因此,切换全屏对OpenGL来说很有趣。 (并且,通过“切换”,我的意思是朝两个方向前进:windowed->全屏或全屏 - >窗口化 - 我得到相同的结果。)

作为替代方案,此代码似乎也会全屏切换:

SDL_Surface *surface = SDL_GetVideoSurce();
Uint32 flags = surface->flags;
flags ^= SDL_FULLSCREEN;
SDL_SetVideoMode(surface->w, surface->h, surface->format->BitsPerPixel, flags);

但是,在此代码之后调用SDL_GetError表示在SDL_SetVideoMode期间设置了“无效窗口”错误。如果我忽略它并尝试加载纹理,则没有崩溃,但我的纹理也没有出现(也许OpenGL只是立即从glTexImage2D返回而没有实际做任何事情)。作为测试,在启动时,我尝试连续两次调用SDL_SetVideoMode以在我第一次加载纹理之前执行切换。在那种特殊情况下,纹理实际上会显示出来。嗯,什么?

我使用的是SDL 1.3.0-6176(2012年1月7日在SDL网站上发布)。

更新

我的纹理上传代码如下(这里没什么好处的)。为了澄清,这个应用程序(包括下面的代码)已经可以作为iOS,Android,PSP和Windows的完成应用程序而没有任何问题。除了Mac之外,Windows是唯一一个使用SDL的版本。

unsigned int Texture::init(const void *data, int width, int height)
{
    unsigned int textureID;
    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_2D, textureID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    return textureID;
}

1 个答案:

答案 0 :(得分:-1)

  

它崩溃了glTexImage2D调用的memcpy中的某些纹理。

这不应该发生。在某些地方存在一些错误,无论是在您的代码中还是在OpenGL实现中。而且我会说这是你的。所以请发布您的纹理分配和上传代码供我们查看。

  

然而,在Mac上,它的实现破坏了OpenGL上下文,它会破坏你的纹理。

是的,不幸的是,这就是 MacOS X 的工作方式。由于其OpenGL驱动程序模型的设计,你可以做到这一点(我提到 MacOS X 糟透了;哦,是的,我做过。有时候。就像一百多次)。同样设计糟糕的驱动程序模型也使 MacOS X 在追赶OpenGL开发方面变得如此之慢。