Opengl libgdx上帝';s光线着色器效果混合函数
我正在尝试使用libgdx和opengl着色器langage从头开始创建上帝的光线效果。为此,我使用背景图像作为光源,然后应用另一个纹理作为遮罩,将spriteBatch颜色设置为全黑 背景纹理 遮罩纹理 然后在背景上以全黑色渲染遮罩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,
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将光线效果设置为完全不透明的黑色,这样它将隐藏彩色形状。我不确定你使用什么方法创建效果纹理。通常,首先只渲染光源(太阳),而不是整个背景场景。(虽然通过渲染高对比度的背景场景可以获得类似的效果。)然后处理完效果后,可以在背景+遮罩上添加绘制效果,而不必担心不透明度。与您的方法相比,您的帧缓冲区可以比屏幕小得多,因为您不必保留背景细节,只需模糊的内容。