在iOS中创buildRGB CVOpenGLESTexture
我正在尝试在iOS中创build一个3通道的 CVOpenGLESTexture
。
通过在CVPixelBufferCreate()
和kCVPixelFormatType_OneComponent8
中为CVPixelBufferCreate()
format
和internalFormat
指定kCVPixelFormatType_OneComponent8
,我可以成功创build单通道纹理。
同样,通过在CVPixelBufferCreate()
指定kCVPixelFormatType_32BGRA
在CVPixelBufferCreate()
GL_RGBA
format
和internalFormat
format
,我可以成功创build4通道 RGBA纹理。
我需要创build具有可访问像素的3通道 24位RGB(或BGR)纹理。
我似乎无法find正确的参数(或其组合)到CVPixelBufferCreate()
和CVOpenGLESTextureCacheCreateTextureFromImage()
不会导致他们之一失败。
附加信息
在我的设备上由CVPixelFormatDescriptionArrayCreateWithAllPixelFormatTypes()
报告支持的FOURCC格式types:
2C08
, r408
, v408
, y408
, y416
, BGRA
, b64a
, b48r
, b32a
, b16g
, R10k
, v308
, v216
, v210
, v410
, r4fl
, grb4
, rgg4
, bgg4
, gbr4
, 420v
, 420f
, 411v
, 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
。
有趣的是,一些这些值没有在CVPixelBuffer.h
定义。
当我将kCVPixelFormatType_24RGB
( 24 == 0x18
)传递给CVPixelBufferCreate()
成功时,但是CVOpenGLESTextureCacheCreateTextureFromImage()
失败, 错误代码为-6683 : kCVReturnPixelBufferNotOpenGLCompatible
。
回答自己,虽然我会很高兴被certificate是错误的,并表明如何做到这一点。
正如我在这里展示的(再次回答我自己),可以列出设备上支持的所有四个CC缓冲区格式,以及与每个这种四CC格式关联的一组格式属性。
这个问题的标志是:
-
kCVPixelFormatOpenGLESCompatibility
-
kCVPixelFormatContainsAlpha
:应该是false; -
kCVPixelFormatContainsRGB
:注意:仅支持__IPHONE_8_0
,但不是绝对必要的; - 使用debugging器,我发现另一个有用的关键:
CFSTR("IOSurfaceOpenGLESTextureCompatibility")
将validationOpenGL ES纹理支持直接像素访问,而不需要(较慢)的glReadPixels()
和glTexImage2D()
。
不幸的是,使用这些标志,似乎目前没有这样的RGB / BGR支持的格式。