TLDR:我不認爲你可以使用相機的輸出與GLKBaseEffect
- 數據從相機是雙平面YUV格式,所以你需要一個定製的片段着色器將其轉換成RGB在渲染時,而GLKBaseEffect
不會自定義着色器。
它看起來像有一些API困惑在這裏,所以閱讀,如果您想了解更多的背景...
雖然CVOpenGLESTexture
類型從CVPixelBuffer
衍生,圖像緩衝區你從CMSampleBufferGetImageBuffer
回來不自動OpenGL ES紋理。每次使用CVOpenGLESTextureCache
從相機獲取幀時,都需要從圖像緩衝區創建紋理。
蘋果GLCameraRipple
示例代碼演示瞭如何做到這一點。下面是一個簡單的概述:
- 建立GL上下文後,
setupAVCapture
方法調用CVOpenGLESTextureCacheCreate
創建一個紋理緩存依賴於這方面。
- 在
captureOutput:didOutputSampleBuffer:fromConnection:
中,他們使用CMSampleBufferGetImageBuffer
從採樣緩衝區中獲取圖像緩衝區,然後使用紋理緩存的CVOpenGLESTextureCacheCreateTextureFromImage
函數從中創建兩個OpenGL ES紋理。您需要兩個紋理,因爲圖像緩衝區在兩個位平面上具有YUV顏色數據。
- 每個紋理獲取綁定渲染創建之後,使用
glBindTexture
。一般情況下,你可以用設置GLKBaseEffect
的texture2d0.name
,它告訴給prepareToDraw
,但GLKBaseEffect
無法呈現YUV更換glBindTexture
電話。
- 與兩個鍵合的紋理繪製,使用其片段着色器首先使通過組合來自Y和UV紋理分量的YUV向量着色器程序,然後執行一個簡單的矩陣乘法根據HDTV將其轉換爲RGB像素顏色色彩空間規格。
因爲您需要YUV到RGB轉換的自定義片段着色器,GLKBaseEffect
不會幫助您。但是,如GLCameraRipple
示例所示,您需要編寫的自定義着色器並不那麼可怕。
嗨rickster,感謝這個相機漣漪軟件的解釋。有些東西我無法得到我的頭 - 如果我自己嘗試繪圖,只是簡單地在屏幕上用兩個三角形繪製紋理,我只會得到一個閃爍着一種顏色的巨大斑點! ... oops無法在評論中插入代碼...我將tex配置爲Z形,其x和y值從0.0到1.0,頂點a Z的值從-1.0到1.0,然後繪製一個三角形帶使用屬性指針調用兩組頂點。 –