1

MainMenuViewController と GLKViewConrtroller である GameViewController があります。

メイン メニューから GameViewController に初めて移動すると、すべてが正常にレンダリングされます。メイン メニューに戻ると、GameViewController とそのビューの割り当てが解除されます (ログに記録しました)。

ゲームに戻ると、空白の画面が表示され、OpenGL に関して何もレンダリングされません。UIKit を使用したオーバーレイ テスト メニューはまだあります。

これは、GameViewController の dealloc メソッドで OpenGL を破棄する方法です。最後の 5 行は、それを機能させるために追加されているため、それらの有無にかかわらず機能しません。

- (void)tearDownGL {

[EAGLContext setCurrentContext:self.context];

glDeleteBuffers(1, &_vertexBuffer);
glDeleteVertexArraysOES(1, &_vertexArray);

self.effect = nil;

_program = nil;

glBindVertexArrayOES(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);

[EAGLContext setCurrentContext: nil];
}
4

1 に答える 1

1

問題は、共有グループ (OpenGL がコンテキスト間でテクスチャとシェーダーを共有できる場所) を使用していないことだと思いますか?

これは、すべての GLKViewController のサブクラスである共有グループを作成するコードです。複数のサブクラスがある場合、必要に応じて、shareGroup をグローバルにするために何かを行う必要があります。

- (void)viewDidLoad
{
     [super viewDidLoad];

     // Create an OpenGL ES context and assign it to the view loaded from storyboard
     GLKView *view = (GLKView *)self.view;

     // GLES 3 is not supported on iPhone 4s, 5. It may 'just work' to try 3, but stick with 2, as we don't use the new features, me thinks.
     //view.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
    //if (view.context == nil)
    static  EAGLSharegroup* shareGroup = nil;
    view.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:shareGroup];
    if (shareGroup == nil)
        shareGroup = view.context.sharegroup;
    ...
于 2015-01-23T15:01:09.563 に答える