SHARE
TWEET

Untitled

a guest Sep 21st, 2014 135 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. attribute vec3 a_position;
  2. attribute vec3 a_normal;
  3.  
  4. uniform mat4 u_proj;
  5. uniform mat4 u_world;
  6.  
  7. struct Light
  8. {
  9.     vec3 worldPos;
  10.     float intensity;
  11.     vec3 color;
  12.     float range;
  13. };
  14.  
  15. uniform Light u_lights[100];
  16. uniform int u_numLights;
  17.  
  18. varying vec3 vHybridLightDir;
  19. varying vec3 vHybridLightPos;
  20. varying vec3 vHybridLightColor;
  21. varying float vHybridLightRange;
  22. varying vec3 vAmbientColor;
  23. varying vec3 vNormal;
  24. varying vec3 vWorldPosition;
  25.  
  26. void main()
  27. {
  28.     vHybridLightDir = vec3(0.0);
  29.     vHybridLightPos = vec3(0.0);
  30.     vHybridLightColor = vec3(0.0);
  31.     vAmbientColor = vec3(0.0);
  32.     vHybridLightRange = 0.0;
  33.     vec4 worldPos = u_world * vec4(a_position, 1.0);
  34.  
  35.     vWorldPosition = worldPos.xyz;
  36.  
  37.     float weight = 0.0;
  38.     vec3 l = vec3(0.0);
  39.     float dotNL = 0.0;
  40.     vec3 lightToVertex;
  41.     float denom = 0.0;
  42.  
  43.     for (int i = 0; i < u_numLights; i++)
  44.     {
  45.         lightToVertex = u_lights[i].worldPos - worldPos.xyz;
  46.         float dist = length(lightToVertex);
  47.         float ratio = clamp(dist / 15.0, 0.0, 1.0);
  48.         float atten = pow(cos(ratio * 3.14159265359) + 1, 2);
  49.         atten *= 0.25;
  50.  
  51.         l = normalize(lightToVertex);
  52.         dotNL = dot(a_normal, l);
  53.  
  54.         weight = atten * (dotNL * 0.5 + 0.5);
  55.  
  56.         vHybridLightPos += (weight * lightToVertex) / dist;
  57.         denom += (weight / dist);
  58.     }
  59.  
  60.     vHybridLightPos /= denom;
  61.     vHybridLightPos += worldPos.xyz;
  62.  
  63.     vec3 hybridToVertex = normalize(vHybridLightPos - worldPos.xyz);
  64.  
  65.     for (int i = 0; i < u_numLights; i++)
  66.     {
  67.         lightToVertex = normalize(u_lights[i].worldPos - worldPos.xyz);
  68.         vHybridLightColor += u_lights[i].color * max(dot(lightToVertex, hybridToVertex), 0.0);
  69.     }
  70.  
  71.     vNormal = a_normal;
  72.  
  73.     gl_Position = u_proj * worldPos;
  74. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top