2011-11-23 60 views
3

這是問題所在,我正在使用OpenGL ES在iPhone上開發一個小項目。我從Brad Larson的ColorTracking App(非常感謝Brad提供它)開始,並根據我的需要進行調整。 ,爲什麼AVCaptureSession的灰度OpenGL ES紋理被替換了?

一切工作正常,但是當我使用kCVPixelFormatType_420YpCbCr8BiPlanarVideoRangekCVPixelBufferPixelFormatTypeKeyAVCaptureVideoDataOutput,因爲我會努力灰度圖像,不需要任何顏色反正,屏幕上的圖像產生沿着翻譯其中熄滅屏幕y軸,以及部分在頂部呈現:

這裏是AA截圖:

enter image description here

當然你需要更改glTexImage2D調用的數據類型從GL_RGBAGL_LUMINANCE爲此工作。

使用kCVPixelFormatType_32BGRA捕獲會話中的GL_RGBA紋理不會發生此行爲。

有誰知道爲什麼會發生這種情況,以及如何解決這個問題? 任何幫助,非常感謝。

+0

@Brad感謝您的編輯。但我有一個簡單的問題。給了它一些想法後,我發現了問題和解決方案。我應該回答我自己的問題還是在評論部分提供答案? – iska

+0

如果這是一個真正的答案,清楚地解釋了你是如何解決問題的,那麼對於你自己的問題留下一個答案是完全可以接受的(甚至鼓勵)。這樣,其他人就知道問題已經解決,將來可能遇到這個問題的人將能夠從您的解決方案中學習。 –

+0

當它讓我時,即5小時內會做;) – iska

回答

3

我已經找到了這個問題的答案:

glTextImage2D呼叫應改爲得到CVImageBufferRef右側基地址:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddressOfPlane(pixelBuffer)); 

// should become 

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, bufferWidth, bufferHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)); 

kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange的情況下,我們需要得到包含亮度數據的第一平面。注意數據類型爲GL_LUMINANCE,數據指針爲CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)