我使用AVFoundation從攝像頭捕獲信息,將其傳遞給CIFilter,以用alpha級別爲0的像素替換較暗的像素,並將其顯示在GLKView上。GLKView + CIImage與Alpha + AVFoundation = Trippy Mess
含視圖控制器是一個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中的圖像繪製零無效。
有什麼我失蹤了嗎?
謝謝布拉德, 不幸的是,這導致EXC_BAD_ACCESS,因爲我不認爲我有使用GLKView時GL_COLOR_BUFFER_BIT的權利。在某種程度上,我可以通過在繪製過濾圖像之前將空白CIImage繪製到CIContext來解決此問題。 另外,我在設置視圖時確實設置了EAGLContext,但思路很好! 我會將其標記爲已回答,但希望查看其他人是否可以先聽到。 再次感謝! –
@Jacob - 奇怪你無法清除GLKView上的顏色位。你應該可以做到這一點。在你做這個之前,你是否嘗試將當前上下文設置爲OpenGL ES上下文?只有當您嘗試從兩個不同的線程同時訪問OpenGL ES上下文時,纔會看到類似這樣的錯誤訪問。 –
我之前設置了EAGLContext,並且它沒有區別... 它仍然導致EXC_BAD_ACCESS,這可能是兩個不同線程訪問EAGLContext的結果,但我沒有明確處理。 謝謝反正! –