Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- precision highp float;
- uniform float time;
- uniform vec2 resolution;
- varying vec3 fPosition;
- varying vec3 fNormal;
- const float PI = 3.14159265359;
- //settings
- const bool gammaCorrection = true;
- const vec3 lightPos = vec3(10.0, 10.0, 10.0);
- const vec3 lightIrradiance = vec3(0.75, 0.75, 0.75);
- const vec3 cameraPos = vec3(0,0,0);
- //material
- const vec3 Cspec = vec3(0.91,0.92,0.92); //Alluminium
- const vec3 Cdiff = vec3(0.0, 0.0, 0.0); //metals have no diffuse color, right?
- const float roughness = 0.3;//is this a good roughness parameter for alluminium?
- const float roughness2 = roughness*roughness;
- //functions
- vec3 Fresnel_Schlick(float VdotH, vec3 F0)
- {
- return F0 + (1.0-F0) * pow(1.0-VdotH, 5.0);
- }
- float GGX_NDF(float roughness2, vec3 n, vec3 m)
- {
- float alpha2 = roughness2*roughness2;
- float NdotM = dot(n,m);
- float denom = pow( ((NdotM)*(NdotM)) * (alpha2-1.0) + 1.0, 2.0 );
- return alpha2 / (PI * denom);
- }
- float BlinnPhong_NDF(float roughness2, vec3 n, vec3 m)
- {
- float alpha2 = roughness2*roughness2;
- float first = 1.0 / (PI * alpha2);
- float sec = pow(dot(n,m), (2.0 / (alpha2)-2.0));
- return first * sec;
- }
- float Geo_Implicit(vec3 l, vec3 v, vec3 n)
- {
- return dot(n,l) * dot(n,v);
- }
- void main()
- {
- vec3 Lo = vec3(0,0,0);
- float dist = length(-fPosition + lightPos);
- float falloff = 1.0 / ( 1.0 + 0.25*dist + 0.125*dist*dist);
- vec3 E = lightIrradiance;// * falloff;
- vec3 l = normalize(-fPosition + lightPos);
- vec3 v = normalize(-fPosition + cameraPos);
- vec3 h = normalize(l+v);
- vec3 n = normalize(fNormal);
- {
- vec3 F = Fresnel_Schlick(dot(v,h), Cspec);
- float D = GGX_NDF(roughness2, n, h);
- //float D = BlinnPhong_NDF(roughness2, n, h);
- float G = Geo_Implicit(l,v,n);
- vec3 Eterm = E * dot(l,n);
- //cook-torrance spec
- Lo = ( (F * D * G) / (4.0 * dot(n,l) * dot(n,v)) ) * Eterm;
- //lambert diffuse
- Lo += (Cdiff / PI) * Eterm;
- }
- vec4 finalColor = vec4(Lo, 1.0);
- //gamma correction
- if(gammaCorrection) {
- finalColor.r = pow(finalColor.r, (1.0/2.2));
- finalColor.g = pow(finalColor.g, (1.0/2.2));
- finalColor.b = pow(finalColor.b, (1.0/2.2));
- }
- gl_FragColor = finalColor;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement