如何在 Libgdx 中混合两种纹理颜色

How to blend two texture colors in Libgdx

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

objective 是只混合这两个元素,其他元素(如背景)不能混合,我不知道如何保持 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);

我从来没有用过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。您将使用以下方法混合 black * 0.6 + white * 0.4(您的 alpha 总和为 1.0),这将使您的 0.4 "darker" 比中间范围的灰色略微 "darker"。

为了将此与您的问题联系起来,您将混合方法指定为 ONE,ONE,即您正在执行黑色 * 1 + 白色 * 1,结果应该是 1(全白)。

查看 libGDX 的文档,您可以选择 GL_ONE_MINUS_CONSTANT_ALPHA 恒定权重混合选项,或者如果您想执行 "alpha blending",您可以选择 GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA.

希望这能帮助和清理混合一点:)