Jump to content
  • Advertisement
Sign in to follow this  
Monsieur Max

OpenGL 2D Color lighting in OpenGl2 ES2

This topic is 1920 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.
Edited by Monsieur Max

Share this post


Link to post
Share on other sites
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.

Edited by newObjekt

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!