Advertisement
Guest User

Untitled

a guest
Jun 12th, 2016
839
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. precision highp float;
  2. uniform float time;
  3. uniform vec2 resolution;
  4. varying vec3 fPosition;
  5. varying vec3 fNormal;
  6.  
  7. const float PI = 3.14159265359;
  8.  
  9. //settings
  10. const bool gammaCorrection = true;
  11. const vec3 lightPos = vec3(10.0, 10.0, 10.0);
  12. const vec3 lightIrradiance = vec3(0.75, 0.75, 0.75);
  13. const vec3 cameraPos = vec3(0,0,0);
  14.  
  15. //material
  16. const vec3 Cspec = vec3(0.91,0.92,0.92); //Alluminium
  17. const vec3 Cdiff = vec3(0.0, 0.0, 0.0); //metals have no diffuse color, right?
  18. const float roughness = 0.3;//is this a good roughness parameter for alluminium?
  19. const float roughness2 = roughness*roughness;
  20.  
  21. //functions
  22. vec3 Fresnel_Schlick(float VdotH, vec3 F0)
  23. {
  24.   return F0 + (1.0-F0) * pow(1.0-VdotH, 5.0);
  25. }
  26.  
  27. float GGX_NDF(float roughness2, vec3 n, vec3 m)
  28. {
  29.   float alpha2 = roughness2*roughness2;
  30.   float NdotM = dot(n,m);
  31.   float denom = pow( ((NdotM)*(NdotM)) * (alpha2-1.0) + 1.0, 2.0 );
  32.  
  33.   return alpha2 / (PI * denom);
  34. }
  35.  
  36. float BlinnPhong_NDF(float roughness2, vec3 n, vec3 m)
  37. {
  38.   float alpha2 = roughness2*roughness2;
  39.  
  40.   float first = 1.0 / (PI * alpha2);
  41.   float sec = pow(dot(n,m), (2.0 / (alpha2)-2.0));
  42.  
  43.   return first * sec;
  44. }
  45.  
  46. float Geo_Implicit(vec3 l, vec3 v, vec3 n)
  47. {
  48.   return dot(n,l) * dot(n,v);
  49. }
  50.  
  51. void main()
  52. {
  53.   vec3 Lo = vec3(0,0,0);
  54.  
  55.   float dist = length(-fPosition + lightPos);
  56.   float falloff = 1.0 / ( 1.0 + 0.25*dist + 0.125*dist*dist);
  57.   vec3 E = lightIrradiance;// * falloff;
  58.  
  59.   vec3 l = normalize(-fPosition + lightPos);
  60.   vec3 v = normalize(-fPosition + cameraPos);
  61.  
  62.   vec3 h = normalize(l+v);
  63.   vec3 n = normalize(fNormal);
  64.  
  65.   {
  66.     vec3 F = Fresnel_Schlick(dot(v,h), Cspec);
  67.     float D = GGX_NDF(roughness2, n, h);
  68.     //float D = BlinnPhong_NDF(roughness2, n, h);
  69.     float G = Geo_Implicit(l,v,n);
  70.     vec3 Eterm = E * dot(l,n);
  71.    
  72.     //cook-torrance spec
  73.     Lo = ( (F * D * G) / (4.0 * dot(n,l) * dot(n,v)) ) * Eterm;
  74.     //lambert diffuse
  75.     Lo += (Cdiff / PI) * Eterm;
  76.   }
  77.  
  78.   vec4 finalColor = vec4(Lo, 1.0);
  79.  
  80.   //gamma correction
  81.   if(gammaCorrection) {
  82.     finalColor.r = pow(finalColor.r, (1.0/2.2));
  83.     finalColor.g = pow(finalColor.g, (1.0/2.2));
  84.     finalColor.b = pow(finalColor.b, (1.0/2.2));
  85.   }
  86.  
  87.   gl_FragColor = finalColor;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement