GLKViewController和GLKView - 第二次创建时不渲染任何内容

时间:2014-09-30 09:52:03

标签: ios objective-c opengl-es glkit glkview

我有一个MainMenuViewController和一个GLKViewConrtroller的GameViewController。

我第一次从主菜单转到GameViewController,一切都很好。如果我回到主菜单,GameViewController及其视图将被取消分配(我记录了它)。

现在回到游戏时,我看到一个空白的屏幕,没有任何东西可以呈现OpenGL。 UIKit的叠加测试菜单仍然存在。

这是我如何在GameViewController的dealloc方法中拆除OpenGL,最后五行被添加为尝试使其工作,因此无论是否使用它们都无法工作。

- (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];
}

1 个答案:

答案 0 :(得分: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;
    ...