1

我有一个 MainMenuViewController 和一个 GameViewController,它是一个 GLKViewConrtroller。

我第一次从主菜单转到 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];
}
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 回答