Jump to content

  • Log In with Google      Sign In   
  • Create Account


Monsieur Max

Member Since 12 Apr 2013
Offline Last Active May 28 2013 02:12 PM
-----

Topics I've Started

2D Color lighting in OpenGl2 ES2

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

PARTNERS