uniform sampler2D Texture; uniform sampler2D NormalMap; uniform int NormalMapExists; varying vec2 texCoord; varying vec3 camVec; varying vec3 lightVec; void main() { vec3 lVec = normalize(lightVec); vec3 cVec = normalize(camVec); 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); vec4 ambient = gl_LightSource[0].ambient; vec4 diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse * max( dot(lVec,norm),0.0); vec4 specular = gl_LightSource[0].specular * shineFactor; gl_FragColor = vec4(TexRGB,1.0)*ambient+(vec4(TexRGB,1.0)*diffuse+specular); }