我有一个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];
}
答案 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;
...