Opengl libgdx上帝';s光线着色器效果混合函数

Opengl libgdx上帝';s光线着色器效果混合函数,opengl,libgdx,shader,blending,Opengl,Libgdx,Shader,Blending,我正在尝试使用libgdx和opengl着色器langage从头开始创建上帝的光线效果。为此,我使用背景图像作为光源,然后应用另一个纹理作为遮罩,将spriteBatch颜色设置为全黑 背景纹理 遮罩纹理 然后在背景上以全黑色渲染遮罩 Color batchColor = batch.getColor(); fbo1.begin(); batch.begin(); batch.draw(textureBackground, 0, 0,

我正在尝试使用libgdx和opengl着色器langage从头开始创建上帝的光线效果。为此,我使用背景图像作为光源,然后应用另一个纹理作为遮罩,将spriteBatch颜色设置为全黑

背景纹理

遮罩纹理

然后在背景上以全黑色渲染遮罩

    Color batchColor = batch.getColor();
    fbo1.begin();
        batch.begin();
            batch.draw(textureBackground, 0, 0, w, h);
            batch.setColor(Color.BLACK);
            batch.draw(textureBar, 0, 0, w, h);
            batch.setColor(batchColor);
        batch.end();
    fbo1.end();

然后应用上帝的光线着色器

Sprite rayEffect = new Sprite(fbo1.getColorBufferTexture());
rayEffect.flip(false, true);

fbo2.begin();
    batch.setShader(shaderGodRay);
    batch.begin();
        rayEffect.draw(batch);
    batch.end();
    batch.setShader(null);
fbo2.end();

在这个阶段光线还可以。我想将原始遮罩颜色与渲染光线混合,以获得最终图像。只有在光线顶部再次渲染遮罩时,彩色遮罩才会完全重叠

    rayEffect = new Sprite(fbo2.getColorBufferTexture());
    rayEffect.flip(false, true);

    batch.begin();
        rayEffect.draw(batch);
        batch.draw(textureBar, 0, 0, w, h);
    batch.end();

我认为alpha混合应该可以做到这一点,但在我的光线渲染图像上,不透明度是完全的。
有人知道如何将这两种纹理混合在一起以获得所需的最终结果吗?

您必须修改遮罩图像中的不透明度。应用遮罩时,在出现遮罩的位置将“不透明度”(opacity everywhere)设置为0。要合成最终图像,请首先渲染彩色遮罩,然后将其上的上帝射线图像与GL_SOURCE_ALPHA、GL_ONE_减去_SOURCE_ALPHA混合。我并没有将此作为答案添加,因为我不知道libgdx是如何工作的,为什么不在上一个代码片段中的textureBar之后绘制光线效果呢?在前两个代码段中,首先绘制条形图(黑色),然后再绘制光线效果。。。但在最后一个片段中,绘制光线,然后绘制条形图;为什么不切换这两个语句?@BDL似乎是个好主意,但你知道如何根据背景纹理上的遮罩分割透明形状吗?@Bret将光线效果设置为完全不透明的黑色,这样它将隐藏彩色形状。我不确定你使用什么方法创建效果纹理。通常,首先只渲染光源(太阳),而不是整个背景场景。(虽然通过渲染高对比度的背景场景可以获得类似的效果。)然后处理完效果后,可以在背景+遮罩上添加绘制效果,而不必担心不透明度。与您的方法相比,您的帧缓冲区可以比屏幕小得多,因为您不必保留背景细节,只需模糊的内容。