标题看起来似乎有些晦涩难懂,但我在那里无法真正解释自己想要做什么,所以我画了一张图以形象地说明我的问题:
黑色部分是透明的(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:我正在使用C++在Android上使用OpenGL-ES 2.0,但是我认为语言/平台并没有那么重要。
最佳答案
我认为不可能仅通过blend函数来做到这一点。您希望将源像素乘以源和目标Alpha,而blendfunc仅允许一个或另一个。
但是,通过使用模板缓冲区可以实现所需的结果。我不是专家,但是我认为您可以在绘制背景图像时将模板op设置为递增,然后在绘制位图时将模板测试设置为拒绝stencil == 0(仍启用混合功能以获得位图的透明区域正确)。您必须查看glStencilOp
和glStencilFunc
的API,以找出要使用的正确参数。
glBlendFunc和glAlphaFunc的某种组合也可能是可行的,但是这将取决于它们的求值顺序,因此我并不乐观。