uniform sampler2D Texture; uniform sampler2D NormalMap; uniform int NormalMapExists; varying vec2 texCoord; varying vec3 camVec; varying vec3 lightVec; //For shadows uniform sampler2D ShadowMap; uniform float ShadowDepth; varying vec4 vPos; varying vec4 gPos; float shadowCoef() { vec4 shadow_coord = gl_TextureMatrix[2]*vPos; shadow_coord.w = shadow_coord.z; // get the stored depth float shadow_d = texture2D(ShadowMap, shadow_coord.xy).x; // get the difference of the stored depth and the distance of this fragment to the light float diff = min(shadow_d - shadow_coord.z,0.0); float shadow_coef = clamp( 20*ShadowDepth*diff + 1.0, 0.0, 1.0); //[0..1] return shadow_coef; } void main() { vec3 lVec = lightVec; vec3 cVec = normalize(camVec); vec4 ambient; vec4 diffuse; vec4 specular; float parallax = 0.035; //double refinement float height = texture2D(NormalMap, texCoord.xy).a; float offset = parallax * (2.0 * height - 1.0); vec2 parallaxTexCoord = texCoord.xy + offset * cVec.xy; height += texture2D(NormalMap, parallaxTexCoord).a; offset = parallax * (height - 1.0); parallaxTexCoord = texCoord.xy + offset * cVec.xy; //go-go-go vec3 TexRGB = texture2D(Texture, parallaxTexCoord).xyz; vec3 norm; if (NormalMapExists == 0) { norm = vec3(0.0,0.0,1.0); } else { norm = texture2D(NormalMap, parallaxTexCoord).xyz * 2.0 - 1.0; } float shineFactor = 15.0 * pow(max(dot(cVec, norm),0.0),gl_FrontMaterial.shininess) / (129.0 - gl_FrontMaterial.shininess); float shadow_coef = shadowCoef(); ambient = gl_LightSource[0].ambient; diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse * min( max(dot(lightVec,norm),0.0),shadow_coef); specular = gl_LightSource[0].specular * min(shineFactor,shadow_coef); gl_FragColor = vec4(TexRGB,1.0)*max(ambient,diffuse)+specular; }