Я целый день пытаюсь найти ответ на этот вопрос.
Проблема:
У меня есть представление OpenGL, я создаю его в IB, инициализирую все буферы и устанавливаю цикл рендеринга в displayLink.,Отлично работает, все хорошо.Но затем я пытаюсь создать еще один контроллер с этим представлением openGL в корневом контроллере и представить его с помощью:
[self presentModalViewController:newPage animated:YES];
Он выглядит хорошо, как я и хотел.Он также прекрасно работает без проблем.Он также инициирован из IB.Но как только я использую
[self dismissModalViewControllerAnimated:YES];
, анимация действительно происходит, вид падает, но когда он падает, он оставляет за собой «мусор» (части изображения на черном фоне) и предыдущий openGL.вид остается черным.Я попытался удалить и восстановить displayLink, но безуспешно.Я снова попытался уничтожить / создать фреймбуферы, и мне удалось однажды заставить его работать, но это заняло много времени, и, поскольку я создаю его из представления, я не знаю, является ли это правильным подходом.Просто, чтобы сделать это проще, вот некоторые части моего кода:
- (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: в основном создает область просмотра, устанавливает усеченную область, все необходимые переменные и состояния.Ничего особенного.
Заранее благодарим за все и каждую минуту, потраченную на это.