Import gears_using_shaders into git
[gears_using_shaders.git] / velvet.fsh
blob59c8adb74e0792e673247f367f7b746e0a59b998
1 // Based on Velvet shader from ATI RenderMonkey Fabric project\r
2 // http://developer.amd.com/gpu/rendermonkey/\r
3 \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
21 {\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
27    // N.L\r
28    return vec4(NdotL, NdotL, NdotL, NdotL);\r
29 }\r
31 void main(void)\r
32 {\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
38    // Hemisphere\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
43    \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