当尝试在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。
导致这种情况的原因是什么?
答案 0 :(得分:0)
“无效的着色器程序,可能是由于超出了硬件资源”和“无法加载内核!”实际上是明显的错误,但前者似乎缺乏一个换行符。我昨天遇到了这个问题,似乎有一些问题来源:
检查帧缓冲区状态以确保其完整 - glCheckFramebufferStatus(GL_FRAMEBUFFER)
应返回GL_FRAMEBUFFER_COMPLETE
- 有关示例,请参阅OpenGL ES programming guide。
在我的情况下,我在Core Image使用的帧缓冲区中添加了深度缓冲区。核心图像显然不喜欢这样 - 一旦我删除了深度缓冲区渲染缓冲区,两个错误消息都消失了,而Core Image也做了它。
答案 1 :(得分:0)
我遇到了同样的问题,删除深度缓冲区删除了错误。