1 // Based on Velvet shader from ATI RenderMonkey Fabric project
\r
2 // http://developer.amd.com/gpu/rendermonkey/
\r
4 varying vec3 eye_position;
\r
5 varying vec3 eye_normal;
\r
6 varying vec4 global_ambient;
\r
7 varying vec4 light_pos;
\r
8 varying vec4 light_color;
\r
9 varying vec4 base_color;
\r
11 const vec4 sheen = vec4(0.8137, 0.8137, 0.8137, 1.0);
\r
12 const vec4 shiny = vec4(0.1267, 0.1267, 0.1267, 1.0);
\r
13 const vec4 Ka = vec4(0.23, 0.23, 0.23, 1.0);
\r
14 const vec4 Kd = vec4(0.43, 0.43, 0.43, 1.0);
\r
16 const float roughness = 0.1;
\r
17 const float edginess = 20.5;
\r
18 const float backscatter = 0.1;
\r
20 vec4 diffuse(vec3 Neye, vec3 Peye)
\r
22 // Compute normalized vector from vertex to light in eye space (Leye)
\r
23 vec3 Leye = (vec3(light_pos) - Peye) / length(vec3(light_pos) - Peye);
\r
25 float NdotL = dot(Neye, Leye);
\r
28 return vec4(NdotL, NdotL, NdotL, NdotL);
\r
33 vec3 Nf = normalize(eye_normal); // Normalized normal vector
\r
34 vec3 Veye = -(eye_position / length(eye_position)); // Normalized eye vector
\r
36 // For every light do the following:
\r
39 vec3 Leye = ( vec3(light_pos) - eye_position) / length( vec3(light_pos) - eye_position); // Leye for a given light
\r
41 // Retroreflective lobe
\r
42 float cosine = clamp(dot(Leye, Veye), 0.0, 1.0);
\r
44 vec4 local_shiny = shiny + pow (cosine, 1.0 / roughness ) * backscatter * light_color * sheen;
\r
46 // Horizon scattering
\r
47 cosine = clamp (dot(Nf, Veye), 0.0, 1.0);
\r
48 float sine = sqrt (1.0 - (cosine * cosine));
\r
49 local_shiny += pow (sine, edginess) * dot(Leye, Nf) * light_color * sheen;
\r
51 // Add in diffuse color and return
\r
52 gl_FragColor = (Ka*global_ambient + Kd*diffuse(eye_normal, eye_position)) * base_color + local_shiny;
\r