Я переключаюсь между двумя контроллерами представления iPhone: начальный viewController, выполняющий представление 3D анимации OpenGL, и второй viewController с представлением UIKit настроек программы. Анимация OpenGL работает нормально, когда я запускаю приложение, и я могу переключиться на второй VC, чтобы изменить настройки программы. Когда я возвращаюсь из VC настроек через делегата, я не могу перезапустить анимацию OpenGL - у меня только черный вид.
Что-нибудь еще нужно сделать, чтобы повторно инициализировать состояние OpenGL-ES, когда я снова переключаюсь в представление GL?
Мой переключатель с GL viewController на настройки viewController работает нормально:
- (IBAction) switchToSettingsView:(id) sender {
SettingsViewController *controller = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil];
controller.settingsDelegate = self;
[self stopTimer]; // Stop the animation
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release];
}
Когда я возвращаюсь из представления настроек через следующего делегата, я вижу только черный фон:
- (void) settingsViewControllerDidFinish:(SettingsViewController *)controller {
[self dismissModalViewControllerAnimated:YES];
[self startTimer];
[glView startAnimation];
[glView drawView]; // Explicitly re-drawing the GL view doesn't help
}
Добавление viewDidAppear / viewWillDisappear не помогло. Их называют как положено.
- (void)viewDidAppear:(BOOL)animated
{
[glView startAnimation];
}
- (void)viewWillDisappear:(BOOL)animated
{
[glView stopAnimation];
}
В настоящее время я не использую CADisplayLink в startAnimation, я использую NSTimer.
Мой OpenGL drawView работает в режиме GL после того, как я возвращаюсь через делегата, но на дисплее ничего не появляется.
ОБНОВЛЕНИЕ: РАЗРЕШЕНО !!! Как и предполагал Кихото, воссоздание контекста EAGL помогло. Я также должен был воссоздать кадровые буферы. Выполнение одного без другого не решило проблему. Вот код, который я использовал для повторной инициализации графического состояния:
// Re-initialize the EAGL context and framebuffers
- (void)reInitContext {
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
[context release]; // Releases the old EAGL Context
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context) {
NSLog(@"RECREATING EAGL CONTEXT FAILED!");
} else {
NSLog(@"RECREATING EAGL CONTEXT SUCCEEDED!");
};
if (![EAGLContext setCurrentContext:context]) {
NSLog(@"RE-SETTING EAGL CONTEXT FAILED!");
} else {
NSLog(@"RE-SETTING EAGL CONTEXT SUCCEEDED!");
};
[self destroyFramebuffer];
[self createFramebuffer];
}