2

我正在制作一个小型 SDL/OpenGL 游戏,用户可以在其中使用可可打开文件对话框 (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
4

3 回答 3

2

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

于 2012-12-30T17:21:18.140 回答
2

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

@autoreleasepool    {
NSOpenGLContext *foo = [NSOpenGLContext currentContext];
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel runModal];
[foo makeCurrentContext];
}
于 2013-01-14T20:45:03.470 回答
1

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

于 2012-12-30T16:00:36.467 回答