0

私は、OpenFrameworks と OpenGL ES 1.1 を使用して、iPad アプリに取り組んでいます。アルファチャンネル付きのビデオを表示する必要があります。それをシミュレートするために、RGBビデオ(アルファチャンネルなし)とアルファチャンネルのみを含む別のビデオがあります(すべてのRGBチャンネルで、白い部分が目に見える部分に対応し、黒い部分が目に見えない部分に対応します)。すべてのビデオは OpenGL テクスチャです。

OpenGL ES 1.1 にはシェーダーがないため、この解決策を見つけました (ここ: OpenGL - 複数のテクスチャを持つマスク):

glEnable(GL_BLEND);
// Use a simple blendfunc for drawing the background
glBlendFunc(GL_ONE, GL_ZERO);
// Draw entire background without masking
drawQuad(backgroundTexture);
// Next, we want a blendfunc that doesn't change the color of any pixels,
// but rather replaces the framebuffer alpha values with values based
// on the whiteness of the mask. In other words, if a pixel is white in the mask,
// then the corresponding framebuffer pixel's alpha will be set to 1.
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
// Now "draw" the mask (again, this doesn't produce a visible result, it just
// changes the alpha values in the framebuffer)
drawQuad(maskTexture);
// Finally, we want a blendfunc that makes the foreground visible only in
// areas with high alpha.
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
drawQuad(foregroundTexture);

それはまさに私がやりたいことですが、glBlendFuncSeparate() は OpenGL ES 1.1 (または iOS) には存在しません。私はglColorMaskでそれをやろうとしていますが、これを見つけました: OpenGLでマスキングを正しく機能させることができません

しかし、うまくいかないのは、彼のマスク テクスチャ ファイルに、私のものではなく「実際の」アルファ チャンネルが含まれているためだと思います。

4

1 に答える 1

1

代わりに、単一のRGBAテクスチャを計算することを強くお勧めします。

これは、より簡単で高速になります(フレームごとに2つのRGBAテクスチャを送信するため-はい、RGBテクスチャは実際にはハードウェアによってRGBAでエンコードされ、Aは無視されます)

glColorMaskは、単に「このチャネルを完全にオンまたはオフにする」と言っているだけなので、役に立ちません。

glBlendFuncSeparateがあれば役立つかもしれませんが、これも良い解決策ではありません。必要な2倍のデータを送信することで、(非常に限られた)iPhoneの帯域幅を台無しにしてしまいます。

アップデート :

OpenFrameworksを使用しているので、そのソースコード(https://github.com/openframeworks/openFrameworks/blob/master/libs/openFrameworks/gl/ofTexture.cppおよびhttps://github.com/openframeworks/ openFrameworks / blob / master / libs / openFrameworks / video / ofVideoPlayer.cpp):

  • ofVideoPlayer :: setUseTexture(false)を使用して、ofVideoPlayer::updateがデータをビデオメモリにアップロードしないようにします。
  • ofVideoPlayer::getPixelsでビデオデータを取得します
  • 結果をRGBAテクスチャにインターリーブします(GL_RGBAofTextureおよびofTexture:: loadDataを使用できます)
  • ofTexture :: Drawを使用して描画します(これはとにかくofVideoPlayerが行うことです)
于 2012-07-26T10:09:18.837 に答える