2

ユーザーがココア オープン ファイル ダイアログ (NSOpenPanel) を使用してマップ/レベルを選択できる小さな SDL/OpenGL ゲームを作成しています。ただし、そうすると、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

さらにテストした後(および以前の回答を読んだ後)、自分に合った解決策を見つけました:

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

これは通常、現在のコンテキストがないために発生します。のような OS 提供のコードNSOpenPanelは、現在の OpenGL コンテキストを変更したり、現在のコンテキストを未定義のままにしたりすることがあります。これが発生した場合は、コンテキストを描画先のコンテキストに戻してください。先週取り組んでいるコードで、これと同じ問題が発生しました。:-)

于 2012-12-30T17:21:18.140 に答える
1

この奇妙な点を回避するには、フレーム バッファの状態が != GL_FRAMEBUFFER_COMPLETE の場合、SDL_SetVideoMode でビューをリセットする必要がありました。

于 2012-12-30T16:00:36.467 に答える