带有Alpha + AVFoundation的GLKView + CIImage = Trippy Mess

时间:2012-06-29 18:48:31

标签: ios avfoundation core-image glkit

我正在使用AVFoundation从相机捕获信息,将其传递给CIFilter,用alpha级别为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中为图片绘制nil无效。

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:1)

您需要使用

等代码清除帧缓冲区的先前内容
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

在绘制新Core Image帧之前的某个时刻。这会将帧缓冲区的内容和alpha通道设置为0.0,为您提供一个清晰的平板,可以在其上绘制过滤后的图像。

您可能还需要使用类似

的设置来设置当前的OpenGL ES上下文
[EAGLContext setCurrentContext:self.openGLESContext];

就在那之前,因为我不记得Core Image是否会为你正在处理的任何线程正确地保留该集合。