在GLKView中使用CIFilter后显示CIImage

4

当我尝试在GLKView中呈现被CIFilter过滤的CIImage时,总是会收到错误消息。错误为"CoreImage: EAGLContext framebuffer或renderbuffer配置不正确!无效的着色器程序,可能是由于超出硬件资源导致无法加载内核!"

以下是我用于显示图像的代码:

- (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];
}

视图控制器是一个GLKViewcontroller。EAContext的类型为CIContext。
可能是什么原因导致这种情况?
2个回答

0

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


0

“Invalid shader program, probably due to exceeding hardware resources”和“Could not load the kernel!”其实是两个不同的错误,但前者似乎没有换行。我昨天遇到了这个问题,看来有几个原因引起这个问题:

  • 检查帧缓冲状态以确保完整 - glCheckFramebufferStatus(GL_FRAMEBUFFER)应该返回GL_FRAMEBUFFER_COMPLETE - 可以参考OpenGL ES编程指南中的示例。

  • 在我的情况下,我将一个深度缓冲区添加到了Core Image使用的帧缓冲区。Core image明显不喜欢这个 - 一旦我删除了深度缓冲区渲染缓冲区,两个错误消息都消失了,并且Core Image开始工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接