Jump to content

  • Log In with Google      Sign In   
  • Create Account

2D Color lighting in OpenGl2 ES2

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1   Members   


Posted 12 April 2013 - 04:20 AM

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.
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 : 

Edited by Monsieur Max, 12 April 2013 - 06:33 AM.

#2   Members   


Posted 15 April 2013 - 11:33 AM

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.

Edited by newObjekt, 15 April 2013 - 11:34 AM.

#3   Members   


Posted 15 April 2013 - 09:16 PM

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

Edited by Jihodg, 15 April 2013 - 09:27 PM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.