我正在制作一个小型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
答案 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