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

Opengl es 如何在Libgdx中混合两种纹理颜色,opengl-es,libgdx,blending,Opengl Es,Libgdx,Blending,我试着混合两个圆圈,一个黑色,另一个白色。它们相交的部分必须为灰色。 我尝试使用混合函数,但没有得到预期的结果 目标是只混合这两个元素,其他元素(如背景)不能在那里混合,我不知道如何保持100%的alpha通道 这是我当前的渲染代码,circle1和circle2是TextureRegion public void draw(Batch batch, float parentAlpha) { super.draw(batch, parentAlpha); batch.enable

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

目标是只混合这两个元素,其他元素(如背景)不能在那里混合,我不知道如何保持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,白色为1。你想要达到的是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

为了将这一点与您的问题联系起来,您将混合方法指定为一,一,也就是说,您使用的是黑*1+白*1,结果应该是1(全白)

查看libGDX的文档,您可以使用GL_ONE_减去glu CONSTANT_ALPHA选项进行恒重混合,或者如果您想进行“ALPHA混合”,您可以选择GL_ALPHA,GL_ONE_减去SRC_ALPHA


希望这有助于清理混合:)

我从来没有使用过libGDX,所以我不确定具体的实现是如何进行的,但我将向您简要介绍您试图实现的目标

可以实现的最基本的混合是使用单个参数t在两种颜色之间进行线性混合。考虑这个例子-假设每个颜色由简单的通道值表示,黑色为0,白色为1。你想要达到的是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

为了将这一点与您的问题联系起来,您将混合方法指定为一,一,也就是说,您使用的是黑*1+白*1,结果应该是1(全白)

查看libGDX的文档,您可以使用GL_ONE_减去glu CONSTANT_ALPHA选项进行恒重混合,或者如果您想进行“ALPHA混合”,您可以选择GL_ALPHA,GL_ONE_减去SRC_ALPHA


希望这有助于清理混合:)

我从来没有使用过libGDX,所以我不确定具体的实现是如何进行的,但我将向您简要介绍您试图实现的目标

可以实现的最基本的混合是使用单个参数t在两种颜色之间进行线性混合。考虑这个例子-假设每个颜色由简单的通道值表示,黑色为0,白色为1。你想要达到的是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

为了将这一点与您的问题联系起来,您将混合方法指定为一,一,也就是说,您使用的是黑*1+白*1,结果应该是1(全白)

查看libGDX的文档,您可以使用GL_ONE_减去glu CONSTANT_ALPHA选项进行恒重混合,或者如果您想进行“ALPHA混合”,您可以选择GL_ALPHA,GL_ONE_减去SRC_ALPHA


希望这有助于清理混合:)

我从来没有使用过libGDX,所以我不确定具体的实现是如何进行的,但我将向您简要介绍您试图实现的目标

可以实现的最基本的混合是使用单个参数t在两种颜色之间进行线性混合。考虑这个例子-假设每个颜色由简单的通道值表示,黑色为0,白色为1。你想要达到的是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

为了将这一点与您的问题联系起来,您将混合方法指定为一,一,也就是说,您使用的是黑*1+白*1,结果应该是1(全白)

查看libGDX的文档,您可以选择GL\u ONE\u减去\u CONSTANT\u ALPHA选项