我正在使用OpenFrameworks和OpenGL ES 1.1开发iPad应用程序。我需要显示带alpha通道的视频。为了模拟它,我有一个RGB视频(没有任何alpha通道)和另一个只包含alpha通道的视频(在每个RGB通道上,所以白色部分对应于可见部分,黑色对应于不可见)。每个视频都是OpenGL纹理。
在OpenGL ES 1.1中没有着色器,所以我找到了这个解决方案(这里:OpenGL - mask with multiple textures):
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);
这正是我想要做的,但是在OpenGL ES 1.1(或iOS)中不存在glBlendFuncSeparate()。我正在尝试用glColorMask做到这一点,我发现了这个:Can't get masking to work correctly with OpenGL
但它不起作用,我猜是因为他的面具纹理文件包含一个'真正的'alpha通道,而不是我的。
答案 0 :(得分:1)
我强烈建议您改为计算单个RGBA纹理。
这将更容易,更快(因为你每帧发送2个RGBA纹理 - 是的,你的RGB纹理实际上是由硬件编码的RGBA,而忽略了A)
glColorMask对你没有帮助,因为它只是说“完全打开或关闭这个频道”。
如果你有glBlendFuncSeparate可以帮助你,但同样,这不是一个好的解决方案:你通过发送两倍于所需的数据来破坏你(非常有限的)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):