Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //attributes from vertex shader
- varying vec4 vColor;
- varying vec2 vTexCoord;
- //our texture samplers
- uniform sampler2D u_texture; //diffuse map
- uniform sampler2D u_normals; //normal map
- //values used for shading algorithm...
- uniform vec2 Resolution; //resolution of screen
- uniform vec3 LightPos; //light position, normalized
- uniform vec4 LightColor; //light RGBA -- alpha is intensity
- uniform vec4 AmbientColor; //ambient RGBA -- alpha is intensity
- uniform vec3 Falloff; //attenuation coefficients
- uniform float lightX; //X Position of light. Can also feed Y for times of the year.
- void main()
- {
- //RGBA of our diffuse color
- vec4 DiffuseColor = texture2D(u_texture, vTexCoord);
- //RGB of our normal map
- vec3 NormalMap = texture2D(u_normals, vTexCoord).rgb;
- int numberOfLights = 5;
- vec3 lightPoses[5];
- lightPoses[0] = vec3(lightX - 1.0, LightPos.y, LightPos.z);
- lightPoses[1] = vec3(lightX - 0.5, LightPos.y, LightPos.z);
- lightPoses[2] = vec3(lightX, LightPos.y, LightPos.z);
- lightPoses[3] = vec3(lightX + 0.5, LightPos.y, LightPos.z);
- lightPoses[4] = vec3(lightX + 1.0, LightPos.y, LightPos.z);
- vec3 Sum = vec3(0.0);
- //Go though both lights.
- for(int index=0; index < numberOfLights; index++)
- {
- //The delta position of light
- vec3 LightDir = vec3(lightPoses[index].xy - (gl_FragCoord.xy / Resolution.xy), LightPos.z * 2.0);
- //Aspect ratio
- float aspectRatio = Resolution.x / Resolution.y;
- //Correct for aspect ratio
- LightDir.x = LightDir.x * (Resolution.x / Resolution.y);
- //Determine distance (used for attenuation) BEFORE we normalize our LightDir
- float D = length(LightDir);
- //normalize our vectors
- vec3 N = normalize(NormalMap * 2.0 - 1.0);
- vec3 L = normalize(LightDir);
- //Pre-multiply light color with intensity
- //Then perform "N dot L" to determine our diffuse term
- vec3 Diffuse = (LightColor.rgb * LightColor.a) * max(dot(N, L), 0.0);
- //pre-multiply ambient color with intensity
- vec3 Ambient = AmbientColor.rgb * AmbientColor.a;
- //Because there are more lights, take off total ambient power.
- Ambient *= vec3(1.0 / float(numberOfLights));
- //calculate attenuation
- float Attenuation = 1.0 / ( Falloff.x + (Falloff.y*D) + (Falloff.z*D*D));
- //the calculation which brings it all together
- vec3 Intensity = Ambient + Diffuse * Attenuation;
- vec3 FinalColor = DiffuseColor.rgb * Intensity;
- Sum += FinalColor;
- }
- gl_FragColor = vec4(Sum, DiffuseColor.a);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement