blob: 184ba29656c6c3a68e34ad5e0b3a3adcd11db254 [file] [log] [blame]
uniform sampler2D DistanceMap;
uniform sampler2D NormalMap;
uniform sampler2D ImageMap;
varying vec3 vertex_normal;
varying vec4 vertex_position;
varying vec4 MapCoord;
void main()
{
const vec4 lightSpecular = vec4(0.8, 0.8, 0.8, 1.0);
const vec4 matSpecular = vec4(1.0, 1.0, 1.0, 1.0);
const float matShininess = 100.0;
const vec2 point_five = vec2(0.5);
// Need the normalized eye direction and surface normal vectors to
// compute the refraction vector through the "front" surface of the object.
vec3 eye_direction = normalize(-vertex_position.xyz);
vec3 normalized_normal = normalize(vertex_normal);
vec3 front_refraction = refract(eye_direction, normalized_normal, 1.5);
// Offset the base map coordinate by the refaction vector, and re-normalize
// to texture coordinate space [0, 1].
vec2 normcoord = (MapCoord.st + front_refraction.st + point_five) * point_five;
vec4 back_normal = texture2D(NormalMap, normcoord);
// Now refract again, using the minus normal from the lookup.
vec3 back_refraction = refract(front_refraction, back_normal.xyz, 1.5);
vec2 imagecoord = (normcoord + back_refraction.st + point_five) * point_five;
vec4 texel = texture2D(ImageMap, imagecoord);
// Add in a specular component
vec3 light_direction = normalize(vertex_position.xyz/vertex_position.w -
LightSourcePosition.xyz/LightSourcePosition.w);
vec3 reflection = reflect(light_direction, normalized_normal);
float specularTerm = pow(max(0.0, dot(reflection, eye_direction)), matShininess);
vec4 specular = (lightSpecular * matSpecular);
gl_FragColor = (specular * specularTerm) + texel;
}