我一整天都在努力寻找答案。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