そのため、CVPixelBuffer をセットアップし、iOS で OpenGL FBO に正常に結び付けました。しかし、OSXで同じことをしようとすると、私は引っ掛かりました。
CVOpenGLTextureCacheCreateTextureFromImage からのテクスチャは、GL_TEXTURE_2D ターゲットではなく GL_TEXTURE_RECTANGLE として返されます。
kCVOpenGLBufferTarget キーを見つけましたが、CVPixelBufferCreate ではなく CVOpenGLBufferCreate で使用することになっているようです。
CVPixelBufferCreate を使用して、OSX で 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 間の互換性に関するシェーダーで多くの問題が発生します。とにかく、正規化されたテクスチャ座標を引き続き使用したいと思います。
この方法で GL_TEXTURE_2D テクスチャを CVPixelBuffer から直接取得できない場合、CVOpenGLBuffer を作成し、それに CVPixelBuffer をアタッチしてピクセル データを取得することはできますか?