1

AVPlayer から CVPixelBufferRef を取得して、2D オブジェクトのテクスチャに使用できるピクセル データを供給することができました。ピクセルバッファにデータがある場合、次のようにします。

CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage('
kCFAllocatorDefault,
  videoTextureCache_,
  pixelBuffer, //this is a CVPixelBufferRef
  NULL,
  GL_TEXTURE_2D, 
  GL_RGBA,
  frameWidth,
  frameHeight,
  GL_BGRA,
  GL_UNSIGNED_BYTE,
  0,
  &texture);

このバッファを使用して GL_TEXTURE_CUBE_MAP を作成したいと思います。私のビデオ フレーム データは、実際には 1 つの画像 (キューブ ストリップなど) の 6 つのセクションであり、合計で立方体の側面を構成します。これを行う方法について何か考えはありますか?

GL_TEXTURE_2D が GL_TEXTURE_CUBE_MAP であるふりをして、スカイボックスのテクスチャを上記のコードで生成されたテクスチャに置き換えることを考えていましたが、これにより歪んだ混乱が生じます (スカイボックスに強制的にテクスチャを付けようとすると予想されるように) GL_TEXTURE_2D。

もう 1 つのアイデアは、glPixelStorei を使用してアンパックをセットアップし、ピクセルバッファから読み取ることでした。

glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, X);
glPixelStorei(GL_UNPACK_SKIP_ROWS, Y);
glTexImage2D(...,&pixelbuffer);

しかし信じられないことに、GL_UNPACK_ROW_LENGTH は iOS 用の OpenGl ES2.0 ではサポートされていません。

それで、ありますか:

-テクスチャを作成するために使用する前に、バッファーをピクセル サブセットにインデックス付けすることで、CVPixelBufferRef のピクセル データを分割する方法はありますか?

-上記のコードで作成されたGL_TEXTURE_2Dのインデックス付きサブセットとして6つの新しいGL_TEXTURE_2Dを作成する方法

- GL_TEXTURE_2D を有効な GL_TEXTURE_CUBE_MAP に変換する方法 (たとえば、GLKit には単一のキューブストリップ ファイルから GL_TEXTURE_CUBE_MAP をロードする Skybox 効果があります。ただし、メモリからテクスチャをロードする方法がありません。そうしないと、ソートされます)

――他にアイデアは?

4

1 に答える 1

1

他の方法でそれが不可能だった場合 (可能性は低いですが、おそらく別の方法があるため、これはおそらく最良の答えではなく、必要以上の作業が必要になります) ここに私が試してみたいハックがあります:

キューブ マップがどのように機能するかは、ジオメトリの中心にあるポイントから各キューブ面に向かって各面のテクスチャを投影することです。したがって、その動作を自分で再現できます。Projective Texturing を使用して、立方体の各面に 1 つずつ、合計 6 つの描画呼び出しを行うことができます。毎回、最初に関心のある顔をステンシル バッファーに描画し、次にテクスチャの射影行列を計算し (この手法はゲームの「スポットライト」効果によく使用されます)、次に変換行列を計算します。各面について、その面に対応するテクスチャの部分のみが (0..1) テクスチャ ルックアップ範囲内に収まるように、フラグメント シェーダのテクスチャの読み取りを拡張するために必要です。すべてがうまくいった場合、0..1 の範囲外のものはすべてステンシル バッファーによって破棄されます。

上記の方法は、キューブ マップのごく一部をマスクして置換するために射影テクスチャリングのみを使用していることを除けば、現在アプリで行っている方法と実際には非常によく似ています。投影している小さな正方形のエッジをピクセル マッチングして、スカイボックスにシームレスに適用する必要があるため、この方法でキューブ マップの動作が実際に再現されると確信しています。できません。

とにかく、2D を CUBEMAP に単純に移行する方法を見つけていただければ幸いです。

于 2012-10-26T00:45:45.210 に答える