precision lowp float; uniform sampler2D Texture; uniform sampler2D NormalMap; uniform vec3 LightDirection; varying vec2 texCoord; varying vec3 camVec; varying vec3 normVec; void main() { 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; vec3 nvec = normalize(normVec); float cosf = max(0.0, dot(nvec, -LightDirection)); gl_FragColor = vec4((texture2D(Texture, parallaxTexCoord).rgb * (cosf * 0.75 + 0.25)), 1.0); }