2012-02-17 3 views
4

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

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

- (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.

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

ответ

0

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

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

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

0

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

Смежные вопросы