与OpenGL glBlendFunc和glBlendEquation混合

我想在背景前画一堆图像。 在图像重叠的地方,我希望将这些图像混合在一起(现在,每次在另一个图像的片段顶部绘制图像片段时,使用0.5个源* 0.5目标颜色的混合)。 我绘制图像之前存在的任何背景都应该被覆盖。

所以基本上我想要:

  • 当图像绘制在背景上时:输出颜色:=图像颜色
  • 当图像A被绘制在图像B的顶部时:输出颜色:= 0.5 *(颜色A +颜色B)

我试过的是以下几点:

// clear the alpha channel of the background already in the framebuffer: GLES20.glColorMask(false, false, false, true); GLES20.glClearColor(0, 0, 0, 0); // clear with alpha == 0 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glColorMask(true, true, true, true); // enable blending for drawing the images GLES20.glEnable(GLES20.GL_BLEND); GLES20.glBlendEquation(GLES20.GL_FUNC_ADD); GLES20.glBlendColor(0, 0, 0, 0.5f); // The alpha blendFunc is chosen such that the resulting alpha // will be 0.5 in any pixel that had already an image fragment // drawn. In those pixels still holding the background, the // alpha should be 0 based on the glClear() above. // For those pixels holding the background, // GL_ONE_MINUS_DST_ALPHA * srcColor + GL_DST_ALPHA * dstColor // should equal srcColor because dstAlpha is 0. // For those pixels already holding an image fragment, // GL_ONE_MINUS_DST_ALPHA * srcColor + GL_DST_ALPHA * dstColor // should be 0.5 * srcColor + 0.5 * dstColor because dstAlpha // will be 0.5 GLES20.glBlendFuncSeparate(GLES20.GL_ONE_MINUS_DST_ALPHA, GLES20.GL_DST_ALPHA, GLES20.GL_CONSTANT_ALPHA, GLES20.GL_ZERO); imageShaderProgram.draw(viewProjectionMatrix); GLES20.glDisable(GLES20.GL_BLEND); [...draw some further foreground...] 

但是,我无法得到这个工作。 结果是我在混合之前绘制的背景仍然没有改变,我之后绘制的前景也出现了。 所有内容(imageShaderProgram.draw(viewProjectionMatrix))都没有跟踪,我在绘制时启用了混合。

如果我放弃glEnable(GLES20.GL_BLEND),我的图像被绘制(但当然不混合)。

这一切看起来就像dstAlpha总是1而不是0或0.5,就像我试图做的那样。 所以我怀疑我的glClear(GL_COLOR_BUFFER_BIT)不能正常工作。 但是,当我将glColorMask更改为(true,false,false,true)时,背景的红色部分被清除,所以我不明白为什么(false,false,false,true)不会将framebuffer的alpha通道设置为0就像我打算的那样。

任何想法我可能做错了什么?