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

时间:2015-07-08 18:39:08

标签: opengl-es libgdx blending

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

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

}

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

编辑:问题解决了。 我使用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);

solved problem

1 个答案:

答案 0 :(得分:3)

我从未使用过libGDX,因此我不确定具体的实现方式如何,但我会向您概述您尝试实现的目标。

您可以实现的最基本的混合是两种颜色之间的线性混合,只有一个参数t。考虑这个例子 - 为了简单起见,我们说每种颜色都用一个通道值表示 - 黑色是0.0,白色是1.0。你想要达到的是中距灰度0.5,为此你可以通过适当地缩放每个通道来混合(黑色* 0.5 +白色* 0.5 = 0.0 * 0.5 + 1.0 * 0.5 = 0.5)

混合颜色的一种更复杂的方法是使用源alpha通道来控制混合权重,因此假设你有一个黑色和一个带有0.4 alpha或不透明度的白色。你可以使用以下方法混合黑色* 0.6 +白色* 0.4(你的alpha总和高达1.0),这会给你0.4一点"更暗"比中档灰色。

要将此问题与您的问题联系起来,您可以将混合方法指定为ONE,ONE,即您正在执行黑色* 1 +白色* 1,这将导致1(全白)。

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

希望这会有所帮助并清除混合:)

相关问题