I'm currently working on a 2D topdown view game, using OpenGL2 ES2. The lighting is a rather important part of the game and I have trouble with my current implementation. I'm invoking the infinite knowledge of the community in order to give me a hand to solve this tricky issue.
Before exposing you the issue, note that I can totally rewrite the whole lighting process if necessary. Of course, tweaking the existing one is fine too !
So, here are the global rendering details:
Game scene without light is rendered in a FBO
Lights are rendered in a FBO
These 2 FBO's are blended to create the scene.
Pretty classic, here are the details of the steps
On step 2 - light rendering:
Each light is a quad using texture in grayscale with no alpha.
Starting from a black screen, each light of the scene is added using glBlendFunc(GL2ES2.GL_ONE, GL2ES2.GL_ONE) and glBlendEquation(GL2ES2.GL_FUNC_ADD)
On step 3 - final scene
Both FBO's textures are rendered each in a quad, the scene first then the light.
Settings are glBlendFunc(GL2ES2.GL_SRC_ALPHA, GL2ES2.GL_ONE_MINUS_SRC_ALPHA) and glBlendEquation(GL2ES2.GL_FUNC_ADD)
In the corresponding fragment shader, final color is calculated multiplying RGB colors from the scene and the light, and alpha is 1.
The result is almost ok ( without lights - with lights ) :
But I have two issues :
Issue 1 : "Light blob" : when two lights are mixed, a light blob forms as in the picture below.
The result is really awkward even if it's mathematically right. The intersection of the two lights gives a feeling of saturation.
Issue 2 : "Color munching" : When two lights are mixed, the color mix is not giving the expected result. In the picture below, the white and yellow color manages to mix together but not in a way that feels natural.
This is ( very probably ) because of the GL_ONE, GL_ONE settings. Again, the result is awkward but mathematically right , the following test proves it, mixing a blue ( 0,0,1) with a yellow (1,1,0) gives a white ( 1,1,1 )
Basically the issue is the same : color mixing always end up being too white.
I'm not a very experienced OpenGL coder and I'm really struggling to find a solution. This is haunting my mind for days.
Does anyone here have an idea that could help me achieve "realistic" colored light mixing in my 2D openGL game ?
Thanks in advance. I'm totally willing to provide more details if needed.
Edit: I add a "live" video in order to display the issue :
when rendering your lights, instead of using glBlendFunc(GL2ES2.GL_ONE, GL2ES2.GL_ONE) useglBlendFunc(GL2ES2.GL_ONE, GL2ES2.GL_ONE_MINUS_SRC_COLOR)... that should reduce the saturation, and with it, a better color blending
hahaha funny thing is, as you can see in your second image there is much better blending and no saturation!... because coincidentally you used blue and yellow and thus not saturated any channel, one light hay no blue channel while the other has only blue channel... of course that didn't happen when you mixed two white lights or a white and a yellow one