所以我已经设置了 CVPixelBuffer,并在 iOS 上成功地将它们绑定到 OpenGL FBO。但是现在尝试在 OSX 上做同样的事情让我陷入了困境。
来自 CVOpenGLTextureCacheCreateTextureFromImage 的纹理返回为 GL_TEXTURE_RECTANGLE 而不是 GL_TEXTURE_2D 目标。
我找到了 kCVOpenGLBufferTarget 键,但它似乎应该与 CVOpenGLBufferCreate 而不是 CVPixelBufferCreate 一起使用。
甚至有可能在 OSX 上使用 CVPixelBufferCreate 获得 GL_TEXTURE_2D 目标纹理,如果可以的话怎么做?
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 之间的兼容性方面出现很多问题。无论如何,我宁愿继续使用归一化纹理坐标。
如果无法以这种方式直接从 CVPixelBuffer 获取 GL_TEXTURE_2D 纹理,是否可以创建一个 CVOpenGLBuffer 并附加一个 CVPixelBuffer 来提取像素数据?