两个对象之间的Alpha混合

时间:2019-12-27 07:34:21

标签: opengl glsl

我的场景中有两个对象,一个矩形和一个圆形。

矩形在z轴上为1个单位,圆在z轴上为0个单位。

矩形的不透明度为50,圆的不透明度为100

即使圆的不透明度为100,为什么矩形的alpha也会减小圆的alpha。

这是Alpha的样子。enter image description here

这是我正在使用的混合模式。

   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

2 个答案:

答案 0 :(得分:1)

可能的解释是,矩形比圆形“暗”。

通过设置Alpha混合时

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

那么最终颜色的公式是

color_dest = color_dest * (1-alpha_source) + color_source * alpha_source

让我们假设圆圈的颜色为1.0。圆的Alpha通道也为1.0。首先绘制圆。目标缓冲区的内容为黑色(0、0、0、0)。
绘制圆后,将应用混合:

color_dest   = color_dest   * (1-alpha_source) + color_source * alpha_source
(1, 1, 1, 1) = (0, 0, 0, 0) * (1 - 1.0)        + (1, 1, 1, 1) * 1.0

矩形的颜色为0.5,alpha通道也为0.5。再次应用混合:

color_dest               = color_dest   * (1-alpha_source) + color_source         * alpha_source
(0.75, 0.75, 0.75, 0.75) = (1, 1, 1, 1) * (1 - 0.5)        + (0.5, 0.5, 0.5, 0.5) * 0.5

因此,矩形覆盖圆的片段的最终颜色为(0.75,0.75,0.75,0.75)。 “较暗”的矩形使圆圈变暗。

答案 1 :(得分:1)

如果您想要不同的RGB颜色方程式和不同的Alpha方程,则可以使用。

  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE);