在GLKView中使用CIFilter后显示CIImage

时间:2012-02-17 15:29:59

标签: ios opengl-es core-image

当尝试在GLKView中呈现由CIFilter过滤的CIImage时,我总是收到错误消息。错误是“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。

导致这种情况的原因是什么?

2 个答案:

答案 0 :(得分:0)

“无效的着色器程序,可能是由于超出了硬件资源”和“无法加载内核!”实际上是明显的错误,但前者似乎缺乏一个换行符。我昨天遇到了这个问题,似乎有一些问题来源:

  • 检查帧缓冲区状态以确保其完整 - glCheckFramebufferStatus(GL_FRAMEBUFFER)应返回GL_FRAMEBUFFER_COMPLETE - 有关示例,请参阅OpenGL ES programming guide

  • 在我的情况下,我在Core Image使用的帧缓冲区中添加了深度缓冲区。核心图像显然不喜欢这样 - 一旦我删除了深度缓冲区渲染缓冲区,两个错误消息都消失了,而Core Image也做了它。

答案 1 :(得分:0)

我遇到了同样的问题,删除深度缓冲区删除了错误。