I am using this masking texture for a dynamic lighting effect in my game:
It looks beautiful until two lights begin to overlap:
This is obviously because the textures are overlapping when I draw them to the light map FrameBuffer
.
lightFbo.begin();
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
g.begin();
for(Entity ent : entities){
if(ent instanceof Fireball)g.draw(light,ent.x - tlightSize / 2.5f,ent.y - tlightSize * 0.25f, tlightSize, tlightSize);
}
if(p instanceof FireCharacter){
g.draw(light,p.x - lightSize / 2.5f,p.y - lightSize * 0.25f, lightSize, lightSize);
}
g.end();
lightFbo.end();
I use the buffer texture from this map when I draw my actual game:'
g.setShader(lightingShader);
g.begin();
lightFbo.getColorBufferTexture().bind(1); //u_lightmap
light.bind(0)//u_texture
//draw things
g.end();
I don't want these to overlap, I want the light circles to merge without the border cutting in front of them. I tried making the black transparent in GIMP on the light texture but that made no difference. Here is the lighting shader:
Vertex Shader
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec4 vColor;
varying vec2 vTexCoord;
void main() {
vColor = a_color;
vTexCoord = a_texCoord0;
gl_Position = u_projTrans * a_position;
}
Fragment Shader
#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying LOWP vec4 vColor;
varying vec2 vTexCoord;
//texture samplers
uniform sampler2D u_texture; //diffuse map
uniform sampler2D u_lightmap; //light map (frame buffer texture)
//additional parameters for the shader
uniform vec2 resolution; //resolution of screen
uniform LOWP vec4 ambientColor; //ambient RGB, alpha channel is intensity
void main() {
vec4 diffuseColor = texture2D(u_texture, vTexCoord);
vec2 lighCoord = (gl_FragCoord.xy / resolution.xy);
vec4 light = texture2D(u_lightmap, lighCoord);
vec3 ambient = ambientColor.rgb * ambientColor.a;
vec3 intensity = ambient + light.rgb;
vec3 finalColor = diffuseColor.rgb * intensity;
gl_FragColor = vColor * vec4(finalColor, diffuseColor.a);
}
My only ideas are using Gdx.gl.glSetBlendFunc(); and changing the blending source and dest values.