6

そのため、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 をアタッチしてピクセル データを取得することはできますか?

4

2 に答える 2

2

これに出くわしたばかりです。他の人が遭遇した場合に備えて、古くても答えます。

iOS は OpenGL ES (最初は 2.0、次に 3.0) を使用します。OS X は通常の古い (非 ES) OpenGL を使用し、コア プロファイル (3.0+ のみ) または互換性プロファイル (3.2 まで) を選択できます。

ここでの違いは、テクスチャ サイズに多くの制限があった OpenGL (非 ES) がずっと前に設計されたことです。カードがこれらの制限を解除したため、GL_TEXTURE_RECTANGLE を含む拡張機能が追加されました。現在、GPU が任意のサイズのテクスチャをサポートすることは大したことではありませんが、API の互換性の理由から、OpenGL を実際に修正することはできません。OpenGL ES は、技術的には並行しているが別の API であり、かなり最近に設計されたものであるため、最初から問題を修正することができました (つまり、古いものを壊すことを心配する必要はありませんでした)。したがって、OpenGL ES の場合、GL_TEXTURE_RECTANGLE を定義したことはなく、GL_TEXTURE_2D にサイズ制限がないことを定義しただけです。

簡単な答え - OS X はデスクトップ OpenGL を使用しますが、これは従来の互換性の理由から長方形のテクスチャを個別に扱いますが、iOS は OpenGL ES を使用します。これは GL_TEXTURE_2D にサイズ制限を設けないため、GL_TEXTURE_RECTANGLE をまったく提供しませんでした。したがって、OS X では、GL_TEXTURE_2D は大量のメモリを浪費するため、CoreVideo は GL_TEXTURE_RECTANGLE オブジェクトを生成しますが、iOS では、GL_TEXTURE_RECTANGLE が存在せず、必要もないため、GL_TEXTURE_2D オブジェクトを生成します。

これは、OpenGL と OpenGL ES の間の残念な非互換性ですが、それが現状であり、何もする必要はありません。または、今、Metal に移行することができます (おそらく検討する必要があります)。

于 2017-03-07T20:01:07.253 に答える
1

これはぶら下がったままになっているようで、私が最近対処したものです。いいえ、GL_TEXTURE_RECTANGLE唯一の使用例のようです。に到達するにはGL_TEXTURE_2D、テクスチャにレンダリングする必要があります。

于 2015-09-28T18:30:31.907 に答える