问题在于,我正在使用OpenGL ES在iPhone上开展一个小项目。我从Brad Larson的ColorTracking App开始(非常感谢Brad提供它)并根据我的需要调整它。
当我在我的kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
中使用kCVPixelBufferPixelFormatTypeKey
AVCaptureVideoDataOutput
时,一切都运行正常,因为我将处理灰度图像并且不需要任何颜色无论如何,屏幕上的结果图像沿y轴平移,屏幕外的部分呈现在顶部:
以下是截图:
当然,您需要将glTexImage2D
来电中的数据类型从GL_RGBA
更改为GL_LUMINANCE
才能生效。
使用GL_RGBA
捕获会话中的kCVPixelFormatType_32BGRA
纹理不会发生此问题。
有谁知道为什么会这样,以及如何解决这个问题? 非常感谢任何帮助。
答案 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)