2012-06-29 47 views
2

我使用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中的圖像繪製零無效。

有什麼我失蹤了嗎?

回答

1

你會需要在某一時刻以清除出像

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

使用代碼的幀緩衝區以前的內容繪製的新酷睿圖像幀之前。這會將framebuffer的內容和alpha通道設置爲0.0,爲您提供一張乾淨的畫面,以便在其上繪製濾鏡圖像。

您可能還需要設置使用的東西當前OpenGL ES的情況下像

[EAGLContext setCurrentContext:self.openGLESContext]; 

之前正確的,因爲我不記得,如果核心形象將正確留下一套不管什麼線程你的工作上。

+1

謝謝布拉德, 不幸的是,這導致EXC_BAD_ACCESS,因爲我不認爲我有使用GLKView時GL_COLOR_BUFFER_BIT的權利。在某種程度上,我可以通過在繪製過濾圖像之前將空白CIImage繪製到CIContext來解決此問題。 另外,我在設置視圖時確實設置了EAGLContext,但思路很好! 我會將其標記爲已回答,但希望查看其他人是否可以先聽到。 再次感謝! –

+0

@Jacob - 奇怪你無法清除GLKView上的顏色位。你應該可以做到這一點。在你做這個之前,你是否嘗試將當前上下文設置爲OpenGL ES上下文?只有當您嘗試從兩個不同的線程同時訪問OpenGL ES上下文時,纔會看到類似這樣的錯誤訪問。 –

+0

我之前設置了EAGLContext,並且它沒有區別... 它仍然導致EXC_BAD_ACCESS,這可能是兩個不同線程訪問EAGLContext的結果,但我沒有明確處理。 謝謝反正! –