没有背景时 OpenGL 加法混合会出现问题
OpenGL Additive blending get issue when no background
当我使用 Additive(glBlendFunc(GL_ONE, GL_ONE) ) 对粒子系统进行混合时,如果有背景,它看起来会很完美,但是当我尝试没有背景时背景,它会变成黑色。
结果是当不是背景(RGBA(0,0,0,0))时,Additive会将黑色加在一起,例如:
RGBA(0,0,0,1) + 背景(RGBA(0,0,0,0)) = RGBA(0,0,0,1);
所以这就是我得到黑色的原因。
如何实现:
- 运行 in android 无背景,但有墙纸。
- 使用Fbo和Fbo清除颜色为RGBA(0,0,0,0),并使用Translucent,然后使用Additive绘制位图到Fbo。
问题:
如何解决这个问题,使位图不带黑色,或者在没有背景的情况下如何避免。
我认为,为了解决您的问题,您需要使用单独的混合,这允许在 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,因此大多数移动设备都应该支持它。
当我使用 Additive(glBlendFunc(GL_ONE, GL_ONE) ) 对粒子系统进行混合时,如果有背景,它看起来会很完美,但是当我尝试没有背景时背景,它会变成黑色。
结果是当不是背景(RGBA(0,0,0,0))时,Additive会将黑色加在一起,例如:
RGBA(0,0,0,1) + 背景(RGBA(0,0,0,0)) = RGBA(0,0,0,1);
所以这就是我得到黑色的原因。
如何实现:
- 运行 in android 无背景,但有墙纸。
- 使用Fbo和Fbo清除颜色为RGBA(0,0,0,0),并使用Translucent,然后使用Additive绘制位图到Fbo。
问题: 如何解决这个问题,使位图不带黑色,或者在没有背景的情况下如何避免。
我认为,为了解决您的问题,您需要使用单独的混合,这允许在 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,因此大多数移动设备都应该支持它。