I been triying this a lot and finaly did something that works.
What I do is:
1- Render to a FrameBufferObject (FBO) the entire scene of the game. With any blend you want (without any “light” or “shadow” here).
//******** PRE-RENDER OF THE SCENE ***********//
fbo.begin();
batch.begin();
//Render scene...use any blendfunc you want.
...
...
batch.end();
fbo.end();
//******** END PRE-RENDER ***********//
2- Render what I call an “environtment shadow”. Just a black rectangle with some transparency.
batch.begin();
//Normal alpha blending for the environtment shadow...
batch.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
batch.setColor(1, 1, 1, shadowIntensity);
batch.draw(shadow, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
batch.setColor(1, 1, 1, 1);
3- Render to the alpha mask the lights.
Gdx.gl.glColorMask(false, false, false, true);
batch.setBlendFunction(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
for(int i= 0; i < lights.size(); i++) lights.get(i).render(batch);
batch.flush();
4- Render the scene again (its already on the FBO, so you only need to render the FBO). This time, you render considering the values of transparency of the alpha mask.
//Now we render the scene pre-rendered considering the alpha mask...
Gdx.gl.glColorMask(true, true, true, true);
batch.setBlendFunction(GL10.GL_DST_ALPHA, GL10.GL_DST_ALPHA);
batch.draw(fboRegion, 0, 0);
5- And finally, if you want lights with color, you need to do one more render on top of all this mess to add colors.
batch.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE);
for(int i= 0; i < lights.size(); i++) lights.get(i).renderLightColor(batch);
Hope it helps.
If you need the Light class just ask for it, but its quite simple.
With this technique I been able to do something like this (the lantern light also change size over time):
http://s22.postimg.org/u8em2v7fl/light1.png
http://s22.postimg.org/5ugbv8ach/light2.png
PD: sorry for bad english xD