没有背景时,OpenGL Additive blend会出现问题

时间:2015-08-06 08:30:13

标签: android opengl-es opengl-es-2.0 blending fbo

当我使用Additive(glBlendFunc(GL_ONE,GL_ONE))来为粒子系统进行混合时,如果有背景它会看起来很完美,但是当我尝试没有背景时,它会得到黑色。登记/> 结果是当不是背景(RGBA(0,0,0,0))时,添加剂会将黑色加在一起,例如:
RGBA(0,0,0,1)+背景(RGBA(0,0,0,0))= RGBA(0,0,0,1);
这就是我得到黑色的原因。
如何实现:

  1. 在没有背景的情况下运行android,但有壁纸。
  2. 使用Fbo和Fbo清晰颜色为RGBA(0,0,0,0),使用Translucent,然后使用Additive将位图绘制到Fbo。
  3. 问题: 如何解决这个问题,使位图不会有黑色,或者在没有背景的情况下如何避免这种情况。

1 个答案:

答案 0 :(得分:0)

我认为为了解决您的问题,您需要使用单独的混合,这允许在RGB和Alpha组件上使用不同的因素。

目前你有类似的东西:

glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE, GL_ONE);

您应该尝试使用此功能:

glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE);

这应该会给你以下结果:

RGBA(0,0,0,1) + background(RGBA(0,0,0,0)) = RGBA(0,0,0,0);

因为在内部它会做类似的事情:

result.rgb = src.rgb * 1.0 + dst.rgb * 1.0 = src.rgb + dst.rgb
result.a = src.a * 0.0 + dst.a * 1.0 = dst.a

所以基本上这会保留目的地(永远不会改变它),同时对RGB组件进行加法混合。

从OpenGLES 2.0开始支持glBlendFuncSeparate,因此大多数移动设备都支持它。