【问题标题】:How to blend two texture colors in Libgdx如何在 Libgdx 中混合两种纹理颜色
【发布时间】:2015-07-08 18:39:08
【问题描述】:

我正在尝试混合两个圆圈,一个是黑色的,另一个是白色的。它们相交的部分必须是灰色的。 我尝试使用混合函数,但没有得到预期的结果。

目标是只混合这两个元素,其他元素(如背景)不能在那里混合,我不知道如何保持 100% 的 alpha 通道。

这是我当前的渲染代码,circle1 和 circle2 是 TextureRegion。

public void draw(Batch batch, float parentAlpha) {
    super.draw(batch, parentAlpha);
    batch.enableBlending();
    batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE);

    batch.draw(circle1, c1.getX(), getY(), getWidth(), getHeight());
    batch.draw(circle2, c2.getX(), getY(), getWidth(), getHeight());

}

这是一个颜色混合的例子。

编辑:问题已解决。 我用Spritebatch做了一个测试,我画了第三个不透明度降低的圆圈​​,这是用于测试的代码和结果:

        Gdx.gl20.glEnable(GL20.GL_BLEND);
        Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        shapeRenderer.setProjectionMatrix(camera.combined);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
        shapeRenderer.setColor(1, 1, 1, 1f);
        shapeRenderer.circle(15, 5, 5);
        shapeRenderer.setColor(0, 0, 0, 1f);
        shapeRenderer.circle(19, 5,5);
        shapeRenderer.setColor(1, 1, 1, 0.5f);
        shapeRenderer.circle(15, 5, 5);
        shapeRenderer.end();
        Gdx.gl20.glDisable(GL20.GL_BLEND);

【问题讨论】:

  • 看起来您希望顶部圆圈和底部圆圈之间的混合与顶部圆圈和紫色背景之间的混合不同。我能想到的最简单的方法是在第二个圆圈之后再次绘制第一个圆圈,但不透明度会降低。并保留GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA的默认混合函数。
  • 这解决了我的问题!我将使用解决方案编辑帖子

标签: opengl-es libgdx blending


【解决方案1】:

我从来没有使用过 libGDX,所以我不确定具体的实现是如何进行的,但我会为您提供您想要实现的大致目标。

您可以实现的最基本的混合是使用单个参数 t 在两种颜色之间进行线性混合。考虑这个例子——为了简单起见,假设每种颜色都由一个通道值表示——黑色是 0.0,白色是 1.0。您想要实现的是 0.5 的中间灰度,为此您可以通过适当缩放每个通道来混合(黑色 * 0.5 + 白色 * 0.5 = 0.0 * 0.5 + 1.0 * 0.5 = 0.5)

一种更复杂的混合颜色方法是使用源 Alpha 通道来控制混合权重,假设您有一个黑色和一个白色,Alpha 为 0.4 或不透明度。您可以使用以下方法进行混合,黑色 * 0.6 + 白色 * 0.4(您的 alpha 总和为 1.0),这将使您的 0.4 比中等灰色稍微“暗”。

为了将此与您的问题联系起来,您将混合方法指定为 ONE,ONE,即您正在做 black * 1 + white * 1,这应该导致 1(全白)。

查看 libGDX 的文档,您可以使用 GL_ONE_MINUS_CONSTANT_ALPHA 选项进行恒重混合,或者如果您想进行“alpha 混合”,您可以选择 GL_ALPHA、GL_ONE_MINUS_SRC_ALPHA。

希望这有助于并清除一些混合:)

【讨论】:

  • 谢谢!现在我更了解这种混合机制是如何工作的 :)
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2023-01-31
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多