NSOpenPanel打破了我的SDL / OpenGL应用程序

时间:2012-12-21 09:07:24

标签: cocoa opengl sdl

我正在制作一个小型SDL / OpenGL游戏,用户可以通过使用cocoa打开文件对话框(NSOpenPanel)来选择地图/关卡。然而,当这样做时,我得到错误"无效的帧缓冲操作"每一个glClear。当我得到帧缓冲区的状态(使用glCheckFramebufferStatus)时,它的GL_FRAMEBUFFER_UNDEFINED(0x8219)。我还注意到我不需要呈现打开的面板(使用runModal),而只需要创建它,以便发生错误。可以在SDL_SetVideoMode之前创建它,但之后不能创建它。奇怪的是,NSSavePanel根本不会引起这些问题。有什么想法吗?

编辑:添加了一些代码以显示精简的test-init方法:

SDL_Init( SDL_INIT_VIDEO );
m_pScreen = SDL_SetVideoMode( 800, 600, 32, SDL_OPENGL );

// this section causes the problem. Works well if I change the NSOpenPanel to a NSSavePanel
@autoreleasepool {
    NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain];    
    [openPanel runModal];
    [openPanel release];
}

int number = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
assert(number == GL_FRAMEBUFFER_COMPLETE); // crash here

3 个答案:

答案 0 :(得分:2)

这通常是因为没有当前的背景。操作系统提供的代码(如NSOpenPanel)有时可以更改当前的OpenGL上下文,或将当前上下文保留为未定义。当发生这种情况时,您必须确保将上下文设置回您正在绘制的上下文。我在上周正在处理的一些代码中遇到了同样的问题! : - )

答案 1 :(得分:2)

经过一些测试(并阅读以前的答案)后,我找到了一个适合我的解决方案:

@autoreleasepool    {
NSOpenGLContext *foo = [NSOpenGLContext currentContext];
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel runModal];
[foo makeCurrentContext];
}

答案 2 :(得分:1)

要解决这个奇怪的问题,我必须使用SDL_SetVideoMode重置我的视图,如果帧缓冲状态!= GL_FRAMEBUFFER_COMPLETE