Отображение CIImage после использования CIFilter в GLKView

Я всегда получаю сообщение об ошибке при попытке представить CIImage, отфильтрованный CIFilter внутри GLKView. Ошибка: «CoreImage: буфер кадра EAGLContext или буфер рендеринга неправильно настроен! Неверная программа шейдера, вероятно, из-за превышения аппаратных ресурсов. Не удалось загрузить ядро!»

Следующий код, который я использую для отображения изображения:

- (void)viewDidLoad 
{
    [super viewDidLoad]; 
    EAcontext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!EAcontext) {
        NSLog(@"Failed to create ES context");
    }
    GLKView *view = (GLKView *)self.view;
    view.context = self.EAcontext;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    glGenRenderbuffers(1, &_renderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
    glGenRenderbuffers(1, &_colorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _colorBuffer);

    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8_OES, 768, 1024);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorBuffer);

    coreImageContext = [CIContext contextWithEAGLContext:self.EAcontext];

    [self updateView];
}

- (void)updateView
{
    UIImage *myimage = [UIImage imageNamed:@"Moskau1.jpg"];
    CIImage *outputImage = [[CIImage alloc] initWithImage:myimage];

    [coreImageContext drawImage:outputImage inRect:self.view.bounds fromRect:[outputImage extent]];    

    [EAcontext presentRenderbuffer:GL_RENDERBUFFER_OES];
}

Viewcontroller - это GLKViewcontroller. EAContext имеет тип CIContext.

Что может быть причиной этого?


person Peter Jaeger    schedule 17.02.2012    source источник


Ответы (2)


«Неверная программа шейдера, вероятно, из-за превышения аппаратных ресурсов» и «Не удалось загрузить ядро!» на самом деле это отдельная ошибка, но в первой, похоже, отсутствует разрыв строки. У меня вчера возникла эта проблема, и, похоже, есть несколько источников этой проблемы:

  • Проверьте состояние буфера кадра, чтобы убедиться, что он полный - glCheckFramebufferStatus(GL_FRAMEBUFFER) должен возвращать GL_FRAMEBUFFER_COMPLETE - см. руководство по программированию OpenGL ES в качестве примера.

  • В моем случае я добавил буфер глубины в буфер кадра, используемый Core Image. Базовому изображению это явно не понравилось - как только я удалил буфер рендеринга буфера глубины, оба сообщения об ошибках исчезли, и Core Image сделал свое дело.

person pmdj    schedule 07.06.2012

У меня возникла та же проблема, и удаление буфера глубины устранило ошибку.

person Jaromir    schedule 30.06.2012