I am trying to create a 3-channel CVOpenGLESTexture
in iOS.
I can successfully create a single-channel texture by specifying kCVPixelFormatType_OneComponent8
in CVPixelBufferCreate()
and GL_LUMINANCE
for both format
and internalFormat
in CVOpenGLESTextureCacheCreateTextureFromImage()
.
Similarly, I can successfully create a 4-channel RGBA texture by specifying kCVPixelFormatType_32BGRA
in CVPixelBufferCreate()
and GL_RGBA
for both format
and internalFormat
in CVOpenGLESTextureCacheCreateTextureFromImage()
.
I need to create 3-channel, 24-bit, RGB (or BGR) texture with accessible pixels.
I cannot seem to find the correct parameters (or combination thereof) to CVPixelBufferCreate()
and CVOpenGLESTextureCacheCreateTextureFromImage()
that will not cause either of them to fail.
Additional Info
The supported FOURCC format types reported by CVPixelFormatDescriptionArrayCreateWithAllPixelFormatTypes()
on my device:
32
, 24
, 16
, L565
, 5551
, L555
, 2vuy
, 2vuf
, yuvs
, yuvf
, 40
, L008
, L010
, 2C08
, r408
, v408
, y408
, y416
, BGRA
, b64a
, b48r
, b32a
, b16g
, R10k
, v308
, v216
, v210
, v410
, r4fl
, grb4
, rgg4
, bgg4
, gbr4
, 420v
, 420f
, 411v
, 411f
, 422v
, 422f
, 444v
, 444f
, y420
, f420
, a2vy
, L00h
, L00f
, 2C0h
, 2C0f
, RGhA
, RGfA
, w30r
, w40a
, w40m
, x420
, x422
, x444
, x44p
, xf20
, xf22
, xf44
, xf4p
, x22p
, xf2p
, b3a8
.
Interestingly, some of these values are not defined in CVPixelBuffer.h
.
When I pass kCVPixelFormatType_24RGB
(24 == 0x18
) to CVPixelBufferCreate()
it succeeds, but then CVOpenGLESTextureCacheCreateTextureFromImage()
fails with error code -6683:kCVReturnPixelBufferNotOpenGLCompatible
.
Answering myself, though I will be happy to be proved wrong and shown how to do this.
As I show here (answering myself yet again) it is possible to list all the fourCC buffer formats supported on the device, and a bunch of format attributes associated with each such fourCC format.
The flags pertinent to this question are:
kCVPixelFormatOpenGLESCompatibility
kCVPixelFormatContainsAlpha
: Should be false;kCVPixelFormatContainsRGB
: Note: supported only from__IPHONE_8_0
, but not strictly necessary;CFSTR("IOSurfaceOpenGLESTextureCompatibility")
which will verify that the OpenGL ES texture supports direct pixel access with no need for (the slower)glReadPixels()
andglTexImage2D()
.Unfortunately, using these flags, it seems that there is currently no such RGB/BGR supported format.