为什么AVCaptureSession的灰度OpenGL ES纹理会被取代?

时间:2011-11-23 18:09:33

标签: iphone ios opengl-es avcapturesession

问题在于,我正在使用OpenGL ES在iPhone上开展一个小项目。我从Brad Larson的ColorTracking App开始(非常感谢Brad提供它)并根据我的需要调整它。

当我在我的kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange中使用kCVPixelBufferPixelFormatTypeKey AVCaptureVideoDataOutput时,一切都运行正常,因为我将处理灰度图像并且不需要任何颜色无论如何,屏幕上的结果图像沿y轴平移,屏幕外的部分呈现在顶部:

以下是截图:

enter image description here

当然,您需要将glTexImage2D来电中的数据类型从GL_RGBA更改为GL_LUMINANCE才能生效。

使用GL_RGBA捕获会话中的kCVPixelFormatType_32BGRA纹理不会发生此问题。

有谁知道为什么会这样,以及如何解决这个问题? 非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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)