2014-09-30 52 views
1

我有一個MainMenuViewController和一個GameViewController是一個GLKViewConrtroller。GLKViewController和GLKView - 渲染沒有第二次創建

我第一次從主菜單進入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

我認爲問題在於您沒有使用共享組 - 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; 
    ... 
+0

這應該是正確答案 – gbk 2016-04-02 19:50:03