3

我正在尝试从相机获取视频并使用 CoreImage 和 OpenGL 进行渲染。当我运行它时,我会按预期在屏幕上看到我的图片,然后我得到 EXEC_BAD_ACCESS。我正在使用ARC。iOS6 Beta1。请帮我修复它。

更新:它在 5.1 中工作,但在 6.0 中崩溃。我提出了所有异常断点,但我只看到 EXEC_BAD_ACESS 发生在 presentRendedBuffer > gpus_ReturnGuiltyForHardwareRestart

Update2:我已经删除了与相机相关的代码,但它仍然崩溃。

更新 3:当我注释掉 glClearColor 和 glClear 命令时,我的应用程序停止崩溃。但我仍然想知道如何同时使用 OpenGL 和 Core Image。

我的新代码很简单:

@interface MGViewController () {
...
}
@property (strong, nonatomic) EAGLContext *glcontext;
@property (strong, nonatomic) CIContext *cicontext;
@property (strong, nonatomic) CIImage *ciimage;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.glcontext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.glcontext) {
        NSLog(@"Failed to create ES context");
    } else {
        self.cicontext = [CIContext contextWithEAGLContext:self.glcontext];

        if (!self.cicontext){
            NSLog(@"Failed to create CI context");
        }
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.glcontext;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    self.ciimage = [[CIImage alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"roomphoto" withExtension:@"png"]];
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{

        glClearColor(0.0, 0.5, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);

        [self.cicontext drawImage:self.ciimage
                           inRect:self.ciimage.extent
                         fromRect:self.ciimage.extent];
}

此代码适用于 iPhone & iPad 6.0 模拟器;在 iPad2 iOS 6.0 Beta2 上使用 EXEC_BAD_ACCESS 崩溃;它在 iPad 1 和 iPhone 4S iOS 5.1.1 上给了我绿屏,并在控制台中显示消息:

Invalid shader program, probably due to exceeding hardware resourcesCould not load the kernel!Could not load the kernel! ...

有什么问题?

4

2 回答 2

2

drawImage:inRect:fromRect 在 iOS 6 中是异步的。

于 2012-10-02T02:07:49.797 回答
2

最后我设法阻止应用程序崩溃。我刚刚在 gl 命令和 [cicontext drawImage...] 命令之间添加了glFlush() 。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{

        glClearColor(0.0, 0.5, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);

        glFlush();

        [self.cicontext drawImage:self.ciimage
                           inRect:self.ciimage.extent
                         fromRect:self.ciimage.extent];
}

结果并不完美:我可以看到一些抖动等,但至少它有效。不过,我会很感激一个详细的答案。

于 2012-06-28T16:14:08.807 回答