我正在尝试在iOS中创建一个3通道CVOpenGLESTexture.
我可以通过在CVPixelBufferCreate()中指定kCVPixelFormatType_OneComponent8并在CVOpenGLESTextureCacheCreateTextureFromImage()中为format和internalFormat指定GL_LUMINANCE来成功创建单通道纹理.
类似地,我可以通过在CVPixelBufferCreate()中指定kCVPixelFormatType_32BGRA并在CVOpenGLESTextureCacheCreateTextureFromImage()中为格式和internalFormat指定GL_RGBA来成功创建4通道RGBA纹理.
我需要创建具有可访问像素的3通道,24位,RGB(或BGR)纹理.
我似乎无法找到CVPixelBufferCreate()和CVOpenGLESTextureCacheCreateTextureFromImage()的正确参数(或其组合),这些参数不会导致其中任何一个失败.
附加信息
我的设备上支持的FOURCC格式类型reported by CVPixelFormatDescriptionArrayCreateWithAllPixelFormatTypes():
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()失败并显示error code -6683:kCVReturnPixelBufferNotOpenGLCompatible.
最佳答案 回答自己,虽然我会很高兴被证明是错误的,并表明如何做到这一点.
当我显示here(再次回答我自己)时,可以列出设备支持的所有四种CC缓冲格式,以及与每种这样的四种CC格式相关的一堆格式属性.
与此问题相关的标志是:
> kCVPixelFormatOpenGLESCompatibility
> kCVPixelFormatContainsAlpha:应该是假的;
> kCVPixelFormatContainsRGB:注意:仅支持__IPHONE_8_0,但不是绝对必要的;
>使用调试器,我找到了另一个有用的密钥:CFSTR(“IOSurfaceOpenGLESTextureCompatibility”),它将验证OpenGL ES纹理支持直接像素访问,而不需要(较慢的)glReadPixels()和glTexImage2D().
不幸的是,使用这些标志,似乎目前没有这种RGB / BGR支持的格式.