Выйти замуж за Core Animation с помощью OpenGL ES

Изменить: я полагаю, что вместо объяснения, приведенного ниже, я также могу спросить: Отправка -setNeedsDisplay в экземпляр CAEAGLLayer не вызывает перерисовку слоя (т. -drawInContext: не вызывается). Вместо этого я получаю это сообщение консоли:

 <GLLayer: 0x4d500b0>: calling -display has no effect. 

Есть ли способ обойти эту проблему? Могу ли я вызвать -drawInContext: когда -setNeedsDisplay ? Длинное объяснение ниже:


У меня есть сцена OpenGL, которую я хотел бы оживить, используя анимацию Core Animation.

Следуя стандартным подходам к анимации пользовательских свойств в CALayer, я создал подкласс CAEAGLLayer и определил свойство sceneCenterPoint в котором значение должно быть анимировано. Мой слой также содержит ссылку на рендеринг OpenGL:

 #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> #import "ES2Renderer.h" @interface GLLayer : CAEAGLLayer { ES2Renderer *renderer; } @property (nonatomic, retain) ES2Renderer *renderer; @property (nonatomic, assign) CGPoint sceneCenterPoint; 

Затем я объявляю свойство @dynamic чтобы CA создавал accessors, переопределял +needsDisplayForKey: и реализовал -drawInContext: передать текущее значение свойства sceneCenterPoint в средство визуализации и попросить его визуализировать сцену:

 #import "GLLayer.h" @implementation GLLayer @synthesize renderer; @dynamic sceneCenterPoint; + (BOOL) needsDisplayForKey:(NSString *)key { if ([key isEqualToString:@"sceneCenterPoint"]) { return YES; } else { return [super needsDisplayForKey:key]; } } - (void) drawInContext:(CGContextRef)ctx { self.renderer.centerPoint = self.sceneCenterPoint; [self.renderer render]; } ... 

(Если у вас есть доступ к видеозаписям сессии WWDC 2009, вы можете просмотреть этот метод в сеансе 303 («Анимированный чертеж»)).

Теперь, когда я создаю явную анимацию для слоя на keyPath @"sceneCenterPoint" , Core Animation должна рассчитать интерполированные значения для пользовательских свойств и вызвать -drawInContext: для каждого шага анимации:

 - (IBAction)animateButtonTapped:(id)sender { CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sceneCenterPoint"]; animation.duration = 1.0; animation.fromValue = [NSValue valueWithCGPoint:CGPointZero]; animation.toValue = [NSValue valueWithCGPoint:CGPointMake(1.0f, 1.0f)]; [self.glView.layer addAnimation:animation forKey:nil]; } 

По крайней мере, это будет происходить для обычного подкласса CALayer . Когда я подкласса CAEAGLLayer , я получаю этот вывод на консоли для каждого шага анимации:

 2010-12-21 13:59:22.180 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. 2010-12-21 13:59:22.198 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. 2010-12-21 13:59:22.216 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. 2010-12-21 13:59:22.233 CoreAnimationOpenGL[7496:207] <GLLayer: 0x4e0be20>: calling -display has no effect. ... 

Похоже, что, возможно, по соображениям производительности, для слоев OpenGL -drawInContext: не получает вызов, потому что эти слои не используют стандартный метод -display для рисования. Кто-нибудь может это подтвердить? Есть ли способ обойти это?

Или я не могу использовать технику, изложенную выше? Это означало бы, что я должен был бы выполнить анимацию вручную в рендерере OpenGL (что возможно, но не как изящная ИМО).

2 Solutions collect form web for “Выйти замуж за Core Animation с помощью OpenGL ES”

Вы пробовали сделать родительский слой выше слоя OpenGL и анимировать это вместо этого?

Вы можете переопределить display вместо drawInContext . Во время анимации анимированное значение находится на уровне презентации.

 - (void) display { GLLayer* myPresentationLayer = (GLLayer*)[self presentationLayer]; self.renderer.centerPoint = myPresentationLayer.sceneCenterPoint; [self.renderer render]; } 

В конце уровень представления будет иметь значение уровня модели, поэтому перед запуском анимации вам нужно будет установить окончательное значение на уровне модели.

  • CVOpenGLESTextureCacheCreateTextureFromImage kCVReturnPixelBufferNotOpenGLCompatible error
  • В OpenGL ES быстрее ли рисовать один большой объект или многие маленькие?
  • логическая загрузка буфера - медленная загрузка буфера кадров - ios
  • glGetUniformLocation return -1 OpenGL ES (iPhone)
  • Как закрыть задачи OpenGL в applicationWillResignActive?
  • Захват видео в реальном времени с экрана iPhone и iPad, включая аудио и запись на YouTube, Facebook и т. Д.
  • OpenGL - почему GL_ELEMENT_ARRAY_BUFFER для индексов?
  • Как GLKit's GLKMatrix «Column Major»?
  • Почему этот шейдер OpenGL ES 2.0 не работает с моим VBO на iOS?
  • OpenGL ES 2.0 рисует простой треугольник, не показывающий ничего
  • Поддержка Opengl ES 3.1 для ios?
  • Interesting Posts

    Eureka Forms для iOS – переменная высота строки?

    Как проверить простой класс объектов данных, который реализует NSCoding?

    Почему Xcode автоматически не связывается с QuartzCore, когда проект использует его?

    Ошибка при сбое PresentViewController на iOS 4.3, но не на iOS 5

    Есть ли способ удалить «год» выбора даты?

    RoboVM не видит iosProvisioningProfile

    Как предотвратить статические изображения в реале Родитель от заикания / загрузки асинхронно на iOS

    MvvmCross, связывающий UIImageView с байтом

    Программирование камеры iOS – Как получить изображения с максимальным разрешением в обратном вызове didOutputSampleBuffer

    что такое пуленепробиваемый метод, чтобы проверить, является ли NSString пустым / нулевым?

    UNNotificationServiceExtension иногда не обновляет уведомления

    NSFetchedResultsController fetchedObjects неверен после того, как изменения распространяются из контекста управляемого фонового объекта

    Как читать контакты в форматах Xamarin

    Центр UIView с автоматической компоновкой просто не работает

    Увеличение памяти при отправке данных из базы данных для загрузки изображения

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.