// GL Shading Language version 1.0 Fragment Shader
//  Orion Sky Lawlor, olawlor@acm.org, 2005/2/10 (Public Domain)

// Vertex/fragment shader interface
varying vec4 world; // World position
varying vec4 worldN; // World normal
varying vec4 albedo; // Material diffuse color
varying vec4 viewdir; // Viewer direction (to camera)

uniform sampler3D myNoise;

void main(void)
{
	vec4 N=worldN;
	N=normalize(N);
	// Specular term: reflect and look up in environment map
	vec4 specular=texture3D(myNoise,vec3(normalize(reflect(-viewdir,N))));
	// Diffuse term: usual lambertian+ambient
	vec4 diffuse=(0.1+0.6*clamp(dot(N,gl_LightSource[0].position),0.0,1.0))*albedo;
	
	// Lerp between specular and diffuse based on fresnel factor:
	float fresnel=0.03+0.8*pow(1.0-clamp(dot(viewdir,N),0.0,1.0),4.0);
	gl_FragColor=diffuse+fresnel*(specular-diffuse);
}
