2D Color lighting in OpenGl2 ES2

Started by
1 comment, last by Jihodg 11 years ago
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:

  1. Game scene without light is rendered in a FBO
  2. Lights are rendered in a FBO
  3. 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 ) :
ScreenShot014.png - ScreenShot013.png
But I have two issues :
Issue 1 : "Light blob" : when two lights are mixed, a light blob forms as in the picture below.
ScreenShot011.png
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.
ScreenShot009.png
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.
ScreenShot011.png
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 )
ScreenShot012.png
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 :
">
Maxime.
Advertisement

I'm far from experienced with lighting but you could try averaging light sources that intersect instead of just adding them together. That would stop them from turning a bright white color.

when rendering your lights, instead of using glBlendFunc(GL2ES2.GL_ONE, GL2ES2.GL_ONE) use glBlendFunc(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

This topic is closed to new replies.

Advertisement