我一整天都在努力尋找答案。OpenGL在從另一個視圖返回後繪製黑色屏幕
問題:
我有OpenGL的看法,我在IB創建,初始化所有緩衝區,並設置其DisplayLink的渲染循環。它工作得很好,一切都很好。但後來我嘗試創建與根控制這個OpenGL視圖,另一個控制器,並使用目前它:
[self presentModalViewController:newPage animated:YES];
這很好地顯示出來,就像我想要的。它也很好,沒有發現問題。它也從IB發起。但只要我使用
[self dismissModalViewControllerAnimated:YES];
動畫確實發生了,這個視圖下去,但它的股價下跌它留下的「垃圾」背後(的觀點在黑色背景的部分)和以前的OpenGL視圖,住宿黑色。我嘗試刪除並重新創建displayLink,但沒有運氣。我試圖再次破壞/創建framebuffers,並且設法讓它工作一次,但花了很長時間,並且從視圖創建它,我不知道這是否是正確的方法。爲了更容易,下面是我的代碼的一些部分:
- (BOOL)createFrameBuffer
{
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
if (YES)
{
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
{
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
return YES;
}
}
- (void)destroyFrameBuffer
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;
if(depthRenderbuffer)
{
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
- (void)layoutSubviews
[EAGLContext setCurrentContext:context];
[self draw:nil];
內部init是我的主要init方法。
- (id)internalInit
{
CAEAGLLayer* eaglLayer = (CAEAGLLayer*) super.layer;
eaglLayer.opaque = YES;
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context]) {
[self release];
return nil;
}
[self createFrameBuffer];
[self setupView:self];
[self drawView: nil];
CADisplayLink* displayLink;
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(draw:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[displayLink setFrameInterval:1];
return self;
}
setupView:方法基本上創建視口,設置視錐,所有必要的變量和狀態。沒什麼特別的。
在此先感謝所有花費的時間。
其實如果我以同樣的方式創建任何其他的UIView(不是openGL),當我解僱它時,我的主要openGL視圖仍然是黑色的。但它仍然被渲染(至少我所有的繪製方法都被調用,並且所有的用戶輸入都被接收和處理)。還有一些來自調試器的幫助,我發現我的frameBuffer,renderBuffer和depthBuffer變量是0(不生成?),所以這可能是我的問題的根源。 – avuthless
通過大量的測試,我發現當我創建另一個opengl視圖時,舊的只是凍結。我認爲它們以某種方式重疊。雖然我寧願他們都保持私人對方。我已經將所有方法聲明爲私有(在.m文件中),我也聲明所有變量都是@private,但這並沒有幫助。我能找到的唯一解決方案是徹底銷燬視圖,然後從頭開始初始化視圖。這對我來說確實有效,但我仍然在尋找正確的答案和方法來解決這個問題。 – avuthless