2D lightning from multiple point sources on GLSL ES 2.0 in iPhone

as i’m a complete noob with shaders i’ve got some problems while trying to get to work a 2D lighting system that basically covers the screen with a 2D black texture with transparent holes where the lighten areas are.

As i’m using only one texture I guess that i must do this in the fragment shader, right?

Fragment shader:


    #ifdef GL_ES
    precision mediump float;
    #endif

    // Texture, coordinates and size
    uniform sampler2D u_texture;
    varying vec2 v_texCoord;
    uniform vec2 textureSize;

    uniform int lightCount;

    struct LightSource
    {
    	vec2 position;
    	float radius;
    	float strength;
    };

    uniform LightSource lights[10];

    void main()
    {
    	float alpha = 1.0;
    	
    	vec2 pos = vec2(v_texCoord.x * textureSize.x, v_texCoord.y * textureSize.y);
    	
    	int i;
    	for (i = 0; i < lightCount; i++)
    	{
    		LightSource source = lights[i];
    		
    		float distance = distance(source.position, pos);
    		
    		if (distance < source.radius)
    		{
    			alpha -= mix(source.strength, 0.0, distance/source.radius);
    		}
    	}
    	
    	gl_FragColor = vec4(0.0, 0.0, 0.0, alpha);
    }

The problem is that the performance is really terrible (cannot run at 60fps with 2 lights and nothing else on screen), any suggestions to make it better or even different ways to approach this problem?

By the way, i’m doing this from cocos2d-x, so if anyone has any idea that uses cocos2d elements it will be welcome as well :slight_smile:

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.