Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在LibGDX中进行混合_Java_Opengl_Libgdx - Fatal编程技术网

Java 如何在LibGDX中进行混合

Java 如何在LibGDX中进行混合,java,opengl,libgdx,Java,Opengl,Libgdx,我基本上想在LibGDX中使用混合模式,但不知道怎么做。我在网上找到了这张照片。我想在LibGDX上做同样的事情。有人能教我怎么做吗 我一直在玩Scene2D。这是我的非工作片段 private class MyGroup extends Group { Image red, blue; public MyGroup() { Texture texture = new Texture(Gdx.files.internal("images/red.png"))

我基本上想在LibGDX中使用混合模式,但不知道怎么做。我在网上找到了这张照片。我想在LibGDX上做同样的事情。有人能教我怎么做吗

我一直在玩Scene2D。这是我的非工作片段

private class MyGroup extends Group {

    Image red, blue;

    public MyGroup() {
        Texture texture = new Texture(Gdx.files.internal("images/red.png"));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
        red = new Image(texture);

        texture = new Texture(Gdx.files.internal("images/blue.png"));
        texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
        blue = new Image(texture);

        red.setX(-25);
        blue.setX(25);
    }
    @Override
    public void draw(Batch batch, float parentAlpha) {
        batch.end();
        batch.begin();
        batch.enableBlending();

        red.draw(batch, parentAlpha);

        Gdx.gl.glEnable(Gdx.gl20.GL_BLEND);
        Gdx.gl.glBlendFuncSeparate(
                Gdx.gl20.GL_DST_COLOR, 
                Gdx.gl20.GL_SRC_COLOR,
                Gdx.gl20.GL_ONE,
                Gdx.gl20.GL_ONE);

        blue.draw(batch, parentAlpha);
    }
}

好吧,部分回答我的问题,这里是我使用的技巧。如果我做错了什么,请告诉我。注意:这在其他函数上不起作用。比如当我组合GL_DST_颜色和GL_ZERO时,它不会输出我想要的。但其他人会。那就玩玩吧。我还在这里寻找其他答案

代码如下:

private class MyGroup extends Group {

    Texture dst, src;

    public MyGroup() {
        dst = new Texture(Gdx.files.internal("images/dst.png"));
        dst.setFilter(TextureFilter.Linear, TextureFilter.Linear);

        src = new Texture(Gdx.files.internal("images/src.png"));
        src.setFilter(TextureFilter.Linear, TextureFilter.Linear);
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        // We need to cast to use blending function
        SpriteBatch sb = (SpriteBatch)batch;

        // draw our destination image
        sb.draw(dst, 0, 0);
        sb.end();

        // remember SpriteBatch's current functions
        int srcFunc = sb.getBlendSrcFunc();
        int dstFunc = sb.getBlendDstFunc();

        // Let's enable blending
        sb.enableBlending();
        sb.begin();

        // blend them
        b.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_SRC_ALPHA);
        sb.draw(src, 0, 0);

        // Reset
        sb.end();
        sb.begin();
        sb.setBlendFunction(srcFunc, dstFunc);

    }
}

我意识到这不是一个新问题,但我想我会与其他人分享一些信息,让他们了解这个问题/答案,而不了解OpenGL中的渲染(了解这些术语非常有帮助,所以你不只是猜测混合和匹配)注意,这就是我自己学到的大部分内容,因此,可以在那里找到更完整的信息

目标颜色:缓冲区中的颜色,除非用新值修改或覆盖,否则最终将绘制该颜色

源颜色:来自其他渲染命令的颜色,可能与目标颜色交互,也可能不交互(取决于我们的设置)

默认混合公式:Final Color=(SourceColor*SourceBlendingFactor)+(DestinationColor*DestinationBlendingFactor)(此默认公式可以更改,但我建议阅读顶部的“我的源代码”链接以了解更多信息)

这两个混合因素是我们可以处理的。我们可以将其设置为:

GL_ZERO:RGB(0,0,0)A(0)
GL_ONE:RGB(1,1,1)A(1)
GL\u SOURCE\u COLOR:RGB(sourceR、sourceG、sourceB)A(sourceA)
GL\u ONE\u减去SRC\u COLOR:RGB(1-sourceR,1-sourceG,1-sourceB)A(1-sourceA)
GL_DST_COLOR:RGB(目的地R、目的地G、目的地B)A(目的地A)
GL\u ONE\u-DST\u COLOR:RGB(1-目的地R、1-目的地、1-目的地B)A(1-目的地A)
GL\u SRC\u ALPHA:RGB(源A、源A、源A)A(源A)
GL\u ONE\u减去SRC\u ALPHA:RGB(1-sourceA,1-sourceA,1-sourceA)A(1-sourceA)
GL_DST_ALPHA:RGB(destinationA,destinationA,destinationA)A(destinationA)
GL\u ONE\u减去DST\u ALPHA:RGB(1-目的地,1-目的地,1-目的地)A(1-目的地)
GL\u SRC\u ALPHA\u饱和:RGB(最小(源A,1-目标A),最小(源A,1-目标A),最小(源A,1-目标A))A(1)

以下内容还使用了一些预定义的恒定颜色,默认为黑色
GL\u常量\u颜色:RGB(康斯坦特、康斯坦特、康斯坦特)A(康斯坦特)
GL\u一减常数\u颜色:RGB(1-康斯坦特,1-康斯坦特,1-康斯坦特)A(1-康斯坦特)
GL_常量_ALPHA:RGB(康斯坦塔、康斯坦塔、康斯坦塔)A(康斯坦塔)
GL\u一减常数\uα:RGB(1-康斯坦塔,1-康斯坦塔,1-康斯坦塔)A(1-康斯坦塔)

所有这些都是预定义的浮点值,它们与源或目标相乘,然后加到另一个

从图像中最容易观察到的是GL_ZERO和GL_ONE。我们最终得到的是任何一个图像


用GL_DST_颜色理解GL_零点

当GL_ZERO位于目标上时,我们将忽略缓冲区中当前的任何颜色信息(因为将所有内容乘以零)。但是,如果源图像上也有GL_DST_颜色,我们最终会将源图像和目标图像的r、g、b、a值相乘

由于示例图像的性质,这在图像中看起来很好。一个用作纯色图像,而另一个灰度图像的外观和行为几乎类似于一束光线,以“显示”从我们的GL_零设置中输出的颜色


希望这有助于解释我们上面看到的图像,并帮助每个人了解这些图像实际上是如何混合在一起的。

您应该在
end()
之后和
begin()
之前调用
enablembling()
,否则您会无缘无故地刷新批处理两次。(刷新会产生成本,例如重新计算矩阵。)或者,您可以只调用
enablembling()
并跳过其他两个调用,因为这会导致刷新。