Почему смещена текстура OpenGL ES в оттенках серого из AVCaptureSession? - PullRequest
3 голосов
/ 23 ноября 2011

Вот проблема, я работаю над небольшим проектом на iPhone с OpenGL ES. Я начал с приложения ColorTracking Брэда Ларсона (большое спасибо Брэду за его предоставление) и настроил его под свои нужды.

Все работает нормально, однако, когда я использую kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange для kCVPixelBufferPixelFormatTypeKey в моем AVCaptureVideoDataOutput, так как я буду работать с изображениями в оттенках серого и в любом случае не буду нуждаться в каких-либо цветах, полученное изображение на экран переводится вдоль оси y, а часть, которая выходит за пределы экрана, отображается сверху:

Вот скриншот:

enter image description here

Конечно, вам нужно изменить тип данных в вызове glTexImage2D с GL_RGBA на GL_LUMINANCE, чтобы это работало.

Такое поведение не возникает при использовании текстуры GL_RGBA из сеанса захвата kCVPixelFormatType_32BGRA.

Кто-нибудь знает, почему это происходит и как это исправить? Любая помощь очень ценится.

1 Ответ

3 голосов
/ 24 ноября 2011

Я нашел ответ на эту проблему:

вызов 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)

...