标题看起来有点神秘,但我无法解释我想做什么,所以我画了一张图片来形象化我的问题:
黑色部分是透明的(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 ++,但我认为语言/平台并不重要。
答案 0 :(得分:1)
我不认为纯粹使用混合功能可以做到这一点。您希望源像素与源alpha和目标alpha相乘,而blendfunc只允许其中一个。
但是,使用模板缓冲区可能会获得所需的结果。我不是它的专家,但我认为你可以在绘制背景图像时将模板操作设置为增量,然后在绘制位图时设置模板测试以拒绝stencil == 0的位置(仍然可以启用混合位图的透明区域正确)。您必须查看glStencilOp
和glStencilFunc
的API,以确定要使用的正确参数。
使用glBlendFunc和glAlphaFunc的某种组合也可能,但它取决于它们被评估的顺序,所以我不是正面的。