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

最後に、アプリがクラッシュするのを防ぐことができました。glコマンドと[cicontextdrawImage...]コマンドの間に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 に答える
2

drawImage:inRect:fromRect は iOS 6 では非同期です。

于 2012-10-02T02:07:49.797 に答える