2

AVFoundation を使用してカメラから情報を取得し、それを CIFilter に渡して暗いピクセルをアルファ レベル 0 のピクセルに置き換え、GLKView に表示しています。

含まれているビュー コントローラーは GLKViewController ですが、プログラムの中身は次の関数で始まります。

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    @autoreleasepool {

        CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);

                CIImage *image = [CIImage imageWithCVPixelBuffer:pixelBuffer options:[NSDictionary dictionaryWithObject:(id)kCFNull forKey:kCIImageColorSpace]];


        image = [image imageByApplyingTransform:CGAffineTransformMakeRotation(-M_PI/2.0)];

        CGPoint origin = [image extent].origin;
        image = [image imageByApplyingTransform:CGAffineTransformMakeTranslation(-origin.x, -origin.y)];

        [self.replaceDarkColorWithTransparentFilter setValue:image forKey:@"inputImage"];

        image = self.replaceDarkColorWithTransparentFilter.outputImage;

        [self.ciContext drawImage:image inRect:CGRectMake(0.0f, 0.0f, 480.0f, 640.0f) fromRect:[image extent]];
        [self.eaglContext presentRenderbuffer:GL_RENDERBUFFER];

        [self.replaceDarkColorWithTransparentFilter setValue:nil forKey:@"inputImage"];
    }
}

GLKViewController では、次を使用してレンダー バッファーを初期化します。

glGenRenderbuffers(1, &_renderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);

その結果、古い画像がクリアされず、透けて見えるようになります。結果は次のようになります: http://d.pr/i/M02zこれは正常ですか? 古い文脈を一掃し、新たに始めることではないでしょうか?

私はglFlush();更新を試みましglkView:(GLKView *)view drawInRect:(CGRect)rectたが、CIContext の Image に対して nil を描画しようとしましたが、役に立ちませんでした。

足りないものはありますか?

4

1 に答える 1

1

次のようなコードを使用して、フレームバッファの以前の内容をクリアする必要があります

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

新しい Core Image フレームを描画する前のある時点で。これにより、フレーム バッファの内容とアルファ チャネルが 0.0 に設定され、フィルタリングされたイメージを描画する白紙の状態になります。

次のようなものを使用して、現在の OpenGL ES コンテキストを設定する必要がある場合もあります。

[EAGLContext setCurrentContext:self.openGLESContext];

その直前に、作業中のスレッドに対して Core Image がその設定を適切に残すかどうか思い出せないためです。

于 2012-06-29T21:28:37.783 に答える