const GLchar* shaderVertSrc[] = {
"attribute float Accessibility;"
"varying vec4 ShadowCoord;"
"const float As = 1.0 / 1.5;"
"const float Ds = 1.0 / 3.0;"
"void main()"
"{"
" vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;"
" vec3 ecPosition3 = (vec3(ecPosition)) / ecPosition.w;"
" vec3 VP = vec3(gl_LightSource[0].position) - ecPosition3;"
" VP = normalize(VP);"
" vec3 normal = normalize(gl_NormalMatrix * gl_Normal);"
" float diffuse = max(0.0, dot(normal, VP));"
" float scale = min(1.0, Accessibility * As + diffuse * Ds);"
" vec4 texCoord = gl_TextureMatrix[1] * gl_Vertex;"
" ShadowCoord = texCoord / texCoord.w;"
" gl_FrontColor = vec4(scale * gl_Color.rgb, gl_Color.a);"
" gl_Position = ftransform();"
"}"
};
const GLchar* shaderFragSrc[] = {
"uniform sampler2DShadow ShadowMap;"
"uniform float Epsilon;"
"uniform bool SelfShadowed;"
"uniform float SelfShadowedVal;"
"uniform float NonSelfShadowedVal;"
"varying vec3 ShadowCoord;"
"float Illumination;"
"float lookup(vec2 position)"
"{"
" float x = position.x;"
" float y = position.y;"
" float depth = shadow2D(ShadowMap, ShadowCoord + vec3(x, y, 0) * Epsilon).x;"
" return depth != 1.0 ? Illumination : 1.0;"
"}"
"void main()"
"{"
" Illumination = SelfShadowed ? SelfShadowedVal : NonSelfShadowedVal;"
" vec2 o = mod(floor(gl_FragCoord.xy), 2.0);"
" float sum = 0.0;"
" sum += lookup(vec2(-1.5, 1.5) + o);"
" sum += lookup(vec2( 0.5, 1.5) + o);"
" sum += lookup(vec2(-1.5, -0.5) + o);"
" sum += lookup(vec2( 0.5, -0.5) + o);"
" gl_FragColor = vec4(sum * 0.25 * gl_Color.rgb, gl_Color.a);"
"}"
};