Hello fellow game coders.
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.
I've reproduced this result easily using anders riggelsen's tool at http://www.andersriggelsen.dk/glblendfunc.php.
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 :