我正在尝试在iOS中创建一个3通道CVOpenGLESTexture
。
我可以通过在CVPixelBufferCreate()
中指定kCVPixelFormatType_OneComponent8
来成功创建单通道纹理,并在CVOpenGLESTextureCacheCreateTextureFromImage()
中为format
和internalFormat
指定GL_LUMINANCE
。
同样,我可以通过在CVPixelBufferCreate()
中指定kCVPixelFormatType_32BGRA
和CVOpenGLESTextureCacheCreateTextureFromImage()
中format
和internalFormat
GL_RGBA
来成功创建 4 通道 RGBA 纹理。
我需要创建具有可访问像素的 3 通道、24 位、RGB(或 BGR)纹理。
我似乎找不到正确的参数(或其组合)来CVPixelBufferCreate()
和CVOpenGLESTextureCacheCreateTextureFromImage()
不会导致它们中的任何一个失败。
附加信息
我的设备上CVPixelFormatDescriptionArrayCreateWithAllPixelFormatTypes()
报告的支持的 FOURCC 格式类型:
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
。
有趣的是,其中一些值未在 CVPixelBuffer.h
中定义。
当我将kCVPixelFormatType_24RGB
(24 == 0x18
)传递给CVPixelBufferCreate()
时,它成功了,但随后CVOpenGLESTextureCacheCreateTextureFromImage()
失败,错误代码为-6683:kCVReturnPixelBufferNotOpenGLCompatible
。
回答我自己,尽管我很高兴被证明是错误的并展示了如何做到这一点。
正如我在这里展示的(再次回答自己),可以列出设备上支持的所有 fourCC 缓冲区格式,以及与每个这样的 fourCC 格式关联的一堆格式属性。
与此问题相关的标志是:
-
kCVPixelFormatOpenGLESCompatibility
-
kCVPixelFormatContainsAlpha
:应为假; -
kCVPixelFormatContainsRGB
: 注意:仅从__IPHONE_8_0
支持,但不是绝对必要的; - 使用调试器,我发现了另一个有用的密钥:
CFSTR("IOSurfaceOpenGLESTextureCompatibility")
它将验证OpenGL ES纹理是否支持直接像素访问,而无需(较慢的)glReadPixels()
和glTexImage2D()
。
不幸的是,使用这些标志,似乎目前没有这种 RGB/BGR 支持的格式。