没有背景时,OpenGL 加法混合会出现问题

Posted

技术标签:

【中文标题】没有背景时,OpenGL 加法混合会出现问题【英文标题】:OpenGL Additive blending get issue when no background 【发布时间】:2015-08-06 08:30:12 【问题描述】:

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

    在没有背景的android中运行,但有壁纸。 使用 Fbo 和 Fbo 清除颜色为 RGBA(0,0,0,0),并使用 Translucent,然后使用 Additive 将位图绘制到 Fbo。

问题: 如何解决这个问题,使位图不会有黑色,或者在没有背景的情况下如何避免。

【问题讨论】:

您能否提供一个视觉示例来说明您正在努力实现的目标以及出了什么问题? 你的例子不是很好 - 如果你添加两个黑色值,你当然会得到黑色......你能提供一个更好的例子...... 【参考方案1】:

我认为为了解决您的问题,您需要使用单独的混合,这允许在 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 组件进行加法混合时保留目的地(永远不要更改它)。

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

【讨论】:

谢谢你的回复,但是如果使用你的方法,那意味着永远不会显示任何东西,因为 alpha 总是 dst.a,但我的背景是 RGBA(0,0,0,0)。 我可能没有正确理解你的问题......你说你得到:RGBA(0,0,0,1) + background(RGBA(0,0,0,0)) = RGBA (0,0,0,1);但我不明白你真正想要的结果......你想得到:RGBA(0,0,0,1)+背景(RGBA(0,0,0,0))= RGBA(0,0, 0,0); ?

以上是关于没有背景时,OpenGL 加法混合会出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在小 alpha 值上错误地在 OpenGL 中混合

Alpha 混合和 UIView 背景颜色

更深层次的深度测试(由混合所引出)

在 OpenGL ES 中混合不能像我认为的那样工作

OpenGL 四 - 002OpenGL 图形渲染之颜色混合

OpenGL:如何实现“橡皮擦”工具?