2014-02-24 48 views
0

我已成立了一個AVCapture會議,並在委託方法,使用下面的代碼來嘗試設置GLKBaseEffect質感與輸出,但是我得到的是黑色的。我應該怎麼做才能使它工作?的iOS GLKit:設置GLKBaseEffect紋理攝像機輸出

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

CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer); 

effect.texture2d0.name = CVOpenGLESTextureGetName(pixelBuffer); 
} 

回答

1

TLDR:我不認爲你可以使用相機的輸出與GLKBaseEffect - 數據從相機是雙平面YUV格式,所以你需要一個定製的片段着色器將其轉換成RGB在渲染時,而GLKBaseEffect不會自定義着色器。

它看起來像有一些API困惑在這裏,所以閱讀,如果您想了解更多的背景...

雖然CVOpenGLESTexture類型從CVPixelBuffer衍生,圖像緩衝區你從CMSampleBufferGetImageBuffer回來不自動OpenGL ES紋理。每次使用CVOpenGLESTextureCache從相機獲取幀時,都需要從圖像緩衝區創建紋理。

蘋果GLCameraRipple示例代碼演示瞭如何做到這一點。下面是一個簡單的概述:

  1. 建立GL上下文後,setupAVCapture方法調用CVOpenGLESTextureCacheCreate創建一個紋理緩存依賴於這方面。
  2. captureOutput:didOutputSampleBuffer:fromConnection:中,他們使用CMSampleBufferGetImageBuffer從採樣緩衝區中獲取圖像緩衝區,然後使用紋理緩存的CVOpenGLESTextureCacheCreateTextureFromImage函數從中創建兩個OpenGL ES紋理。您需要兩個紋理,因爲圖像緩衝區在兩個位平面上具有YUV顏色數據。
  3. 每個紋理獲取綁定渲染創建之後,使用glBindTexture。一般情況下,你可以用設置GLKBaseEffecttexture2d0.name,它告訴給prepareToDraw,但GLKBaseEffect無法呈現YUV更換glBindTexture電話。
  4. 與兩個鍵合的紋理繪製,使用其片段着色器首先使通過組合來自Y和UV紋理分量的YUV向量着色器程序,然後執行一個簡單的矩陣乘法根據HDTV將其轉換爲RGB像素顏色色彩空間規格。

因爲您需要YUV到RGB轉換的自定義片段着色器,GLKBaseEffect不會幫助您。但是,如GLCameraRipple示例所示,您需要編寫的自定義着色器並不那麼可怕。

+0

嗨rickster,感謝這個相機漣漪軟件的解釋。有些東西我無法得到我的頭 - 如果我自己嘗試繪圖,只是簡單地在屏幕上用兩個三角形繪製紋理,我只會得到一個閃爍着一種顏色的巨大斑點! ... oops無法在評論中插入代碼...我將tex配置爲Z形,其x和y值從0.0到1.0,頂點a Z的值從-1.0到1.0,然後繪製一個三角形帶使用屬性指針調用兩組頂點。 –