[英]GLKView + CIImage with Alpha + AVFoundation = Trippy Mess
我正在使用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中为Image绘制nil无济于事。
有什么我想念的吗?
您将需要使用以下代码清除帧缓冲区的先前内容
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是否会针对您正在处理的任何线程正确设置该设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.