hitcircle3D.fsh 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #version 110
  2. varying vec3 vertex;
  3. varying vec3 vertexCam;
  4. varying vec3 normal;
  5. varying vec3 normalCam;
  6. uniform float time;
  7. uniform mat4 modelMatrix;
  8. uniform vec3 eye;
  9. uniform float brightness;
  10. uniform float ambient;
  11. uniform vec3 lightPosition;
  12. uniform float diffuse;
  13. uniform float phong;
  14. uniform float phongExponent;
  15. uniform float rim;
  16. void main()
  17. {
  18. // constants
  19. float brightnessHDR = brightness;
  20. vec3 ambient_color = vec3(1.0, 1.0, 1.0);
  21. vec3 light_position = lightPosition + vec3(0.0, 0.0, -modelMatrix[3].z);
  22. vec3 light_color = vec3(1.0, 1.0, 1.0);
  23. float light_diffuse = ((1.0 - ambient) / 3.0) * diffuse;
  24. float light_phong = ((1.0 - ambient) / 3.0) * phong;
  25. float light_rim = ((1.0 - ambient) / 3.0) * rim;
  26. vec4 out_color = vec4(0.0, 0.0, 0.0, 1.0);
  27. vec3 position = vec3(modelMatrix * vec4(vertex, 1.0));
  28. vec3 pointToLightVector = light_position - position;
  29. // ambient
  30. out_color.rgb += ambient_color * ambient;
  31. // lambert
  32. float distFromLightToPoint = length(pointToLightVector);
  33. float diffuseFactor = clamp(dot(normal, pointToLightVector) / distFromLightToPoint, 0.0, 1.0);
  34. float diffuseMultiplier = smoothstep(0.0, 1.0, diffuseFactor);
  35. out_color.rgb += light_color * diffuseMultiplier * light_diffuse;
  36. // phong
  37. vec3 eyeToPointVector = normalize(eye - position);
  38. vec3 reflectedPointToLightVector = normalize(-reflect(pointToLightVector, normal));
  39. float specularDot = max(dot(reflectedPointToLightVector, eyeToPointVector), 0.0);
  40. float specularMultiplier = clamp(pow(specularDot, phongExponent), 0.0, 1.0);
  41. out_color.rgb += light_color * specularMultiplier * light_phong;
  42. float specularHDR = clamp(pow(specularDot, phongExponent * 5.0), 0.0, 1.0);
  43. out_color.rgb += light_color * specularHDR * 0.25 * phong;
  44. // rim
  45. float rimDot = max(dot(normalCam, normalize(-vertexCam)), 0.0);
  46. float rimFactor = 1.0 - rimDot;
  47. float rimMultiplier = smoothstep(0.375, 1.0, rimFactor);
  48. out_color.rgb += light_color * rimMultiplier * light_rim;
  49. // brightness
  50. out_color.rgb *= 1.0 + (brightnessHDR - ambient - (diffuseMultiplier * light_diffuse) - (specularMultiplier * light_phong) - (rimMultiplier * light_rim));
  51. // (regular color mod)
  52. gl_FragColor = out_color * gl_Color;
  53. }