vertex_shader "varying vec3 tangent; varying vec3 shadowcoord; varying vec3 normal; void main() { gl_Position = ftransform(); vec2 temp = normalize(gl_Vertex.xz); tangent = normalize(gl_NormalMatrix*vec3(temp.x, 0.0, temp.y)); vec4 eye_pos = gl_ModelViewMatrix*gl_Vertex; shadowcoord = vec3(dot(gl_EyePlaneS[3], eye_pos), dot(gl_EyePlaneT[3], eye_pos), dot(gl_EyePlaneR[3], eye_pos)); normal = normalize(gl_NormalMatrix*gl_Normal); }"; fragment_shader "uniform sampler2DShadow shadow; varying vec3 tangent; varying vec3 shadowcoord; varying vec3 normal; void main() { float diffuse = max(dot(gl_LightSource[0].position.xyz, normal), 0.0)*(0.6+0.4*abs(dot(gl_LightSource[0].position.xyz, tangent))); vec4 color = gl_FrontMaterial.diffuse; gl_FragColor = vec4((0.3+diffuse*0.7*shadow2D(shadow, shadowcoord).r)*color.rgb, color.a); }";