我可以使用OpenGL-ES glBlendFunc来影响混合以考虑目标吗?

时间:2012-03-10 13:53:14

标签: java android c++ opengl-es

标题看起来有点神秘,但我无法解释我想做什么,所以我画了一张图片来形象化我的问题:

enter image description here

黑色部分是透明的(aka alpha = 0)。我在帧缓冲区中有蓝色对象(左),并希望将白色位图(中间)渲染到它上面,这样看起来就像合并的位图(右)。

问题在于,如果我使用标准glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则会显示白色对象的整个部分。我不希望它与帧缓冲区(蓝色)中的东西完全重叠,但只在其具有alpha值>的部分上可见。 0(可见)。然后它还应该考虑自己的alpha值(注意白色物体中的洞)。

使用glBlendFunc可以这样吗或者我必须为此写一个着色器吗?

PS:我在http://www.khronos.org/opengles/documentation/opengles1_0/html/glBlendFunc.html查看了glBlendFunc的文档,但我并没有随时随地使用它。

PPS:我在Android上使用OpenGL-ES 2.0和C ++,但我认为语言/平台并不重要。

1 个答案:

答案 0 :(得分:1)

我不认为纯粹使用混合功能可以做到这一点。您希望源像素与源alpha和目标alpha相乘,而blendfunc只允许其中一个。

但是,使用模板缓冲区可能会获得所需的结果。我不是它的专家,但我认为你可以在绘制背景图像时将模板操作设置为增量,然后在绘制位图时设置模板测试以拒绝stencil == 0的位置(仍然可以启用混合位图的透明区域正确)。您必须查看glStencilOpglStencilFunc的API,以确定要使用的正确参数。

使用glBlendFunc和glAlphaFunc的某种组合也可能,但它取决于它们被评估的顺序,所以我不是正面的。