Итак, я настроил CVPixelBuffer и успешно привязал их к OpenGL FBO на iOS. Но теперь попытка сделать то же самое на OSX меня зацепила.
Текстуры из CVOpenGLTextureCacheCreateTextureFromImage возвращаются как цели GL_TEXTURE_RECTANGLE вместо целей GL_TEXTURE_2D.
Я нашел ключ kCVOpenGLBufferTarget, но похоже, что он должен использоваться с CVOpenGLBufferCreate, а не с CVPixelBufferCreate.
Возможно ли вообще получить целевые текстуры GL_TEXTURE_2D на OSX с помощью CVPixelBufferCreate, и если да, то как?
FWIW список настроек CV PBO:
NSDictionary *bufferAttributes = @{ (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA), (__bridge NSString *)kCVPixelBufferWidthKey : @(size.width), (__bridge NSString *)kCVPixelBufferHeightKey : @(size.height), (__bridge NSString *)kCVPixelBufferIOSurfacePropertiesKey : @{ } };
if (pool)
{
error = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, pool, &renderTarget);
}
else
{
error = CVPixelBufferCreate(kCFAllocatorDefault, (NSUInteger)size.width, (NSUInteger)size.height, kCVPixelFormatType_32BGRA, (__bridge CFDictionaryRef)bufferAttributes, &renderTarget);
}
ZAssert(!error, @"Couldn't create pixel buffer");
error = CVOpenGLTextureCacheCreate(kCFAllocatorDefault, NULL, [[NSOpenGLContext context] CGLContextObj], [[NSOpenGLContext format] CGLPixelFormatObj], NULL, &textureCache);
ZAssert(!error, @"Could not create texture cache.");
error = CVOpenGLTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, renderTarget, NULL, &renderTexture);
ZAssert(!error, @"Couldn't create a texture from cache.");
GLuint reference = CVOpenGLTextureGetName(renderTexture);
GLenum target = CVOpenGLTextureGetTarget(renderTexture);
ОБНОВЛЕНИЕ: мне удалось успешно использовать полученные текстуры GL_TEXTURE_RECTANGLE. Однако это вызовет много проблем с шейдерами для совместимости между iOS и OSX. И в любом случае я предпочел бы продолжать использовать нормализованные координаты текстуры.
Если таким образом невозможно получить текстуры GL_TEXTURE_2D непосредственно из CVPixelBuffer, возможно ли создать CVOpenGLBuffer и подключить к нему CVPixelBuffer для получения данных пикселей?