[英]iOS GLKit: set GLKBaseEffect texture with camera output
我已經建立了一個AVCapture會話,並在委托方法中,使用以下代碼嘗試通過輸出設置GLKBaseEffect紋理,但是我得到的只是黑色。 我應該怎么做才能使其正常工作?
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);
effect.texture2d0.name = CVOpenGLESTextureGetName(pixelBuffer);
}
TLDR:我認為您不能將相機輸出與GLKBaseEffect
-來自相機的數據為雙平面YUV格式,因此您需要一個自定義片段着色器以在渲染時將其轉換為RGB,而GLKBaseEffect
不會執行自定義着色器。
看起來這里有些API混亂,因此,如果您需要更多背景知識,請繼續閱讀...
盡管CVOpenGLESTexture
類型是從CVPixelBuffer
派生的, CVPixelBuffer
CMSampleBufferGetImageBuffer
返回的圖像緩沖區並不是自動的OpenGL ES紋理。 每次使用CVOpenGLESTextureCache
從相機獲取一幀時,都需要從圖像緩沖區創建紋理。
蘋果的GLCameraRipple
示例代碼說明了如何執行此操作。 快速概覽:
setupAVCapture
方法將調用CVOpenGLESTextureCacheCreate
來創建綁定到該上下文的紋理緩存。 captureOutput:didOutputSampleBuffer:fromConnection:
,他們使用CMSampleBufferGetImageBuffer
從樣本緩沖區中獲取圖像緩沖區,然后使用紋理緩存的CVOpenGLESTextureCacheCreateTextureFromImage
函數從中創建兩個OpenGL ES紋理。 您需要兩個紋理,因為圖像緩沖區在兩個位平面中具有YUV顏色數據。 glBindTexture
創建后就必須進行渲染。 一般情況下,你可以更換glBindTexture
與呼叫設置GLKBaseEffect
的texture2d0.name
,它告訴給prepareToDraw
,但GLKBaseEffect
無法呈現YUV。 因為您需要用於YUV到RGB轉換的自定義片段着色器,所以GLKBaseEffect
無法為您提供幫助。 但是,如GLCameraRipple
示例所示,您需要編寫的自定義着色器並不是那么可怕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.