// Tex coord is actually the vertices projected to the near projection plane of the light projection space.
// Depth texture is just like mapped to the near projection plane(a quad ranges from -1.0 to 1.0 according to
// the x and ycoordinate axes of the light projection space). And shadow texcoord is just used to sample the
// depth texture and map correct texels to the corresponding fragment.
// In depth texture, color of objects and surfaces that light CANNOT arrive is definitely white(vec4(1.0)) or
// black(vec4(vec3(0.0), 1.0)) depends on your hardware. Color of those light can arrive is a gray-scale color
// (depth-distance from light source).
// NOTICE: with GL_TEXTURE_COMPARE_MODE GL_COMPARE_REF_TO_TEXTURE and
GL_TEXTURE_COMPARE_FUNC GL_LEQUAL, depth texture sampling color will be like above.
// so the function "textureProj()" works with the following rule:
// 1. if the color of the sampled texel is white(or black), it can be considered that this fragment is in the
// shadow;
// 2. if the color of the sampled texel is a gray-scale color, the corresponding fragment is being illuminated.
// shade normally with lighting.
// So key is to transform vertices into light projection space, project them to the near plane of the light
// Projection frustum, and then use them as texcoords, and run further steps in fragment shader with textureProj().
// Depth texture is just like mapped to the near projection plane(a quad ranges from -1.0 to 1.0 according to
// the x and ycoordinate axes of the light projection space). And shadow texcoord is just used to sample the
// depth texture and map correct texels to the corresponding fragment.
// In depth texture, color of objects and surfaces that light CANNOT arrive is definitely white(vec4(1.0)) or
// black(vec4(vec3(0.0), 1.0)) depends on your hardware. Color of those light can arrive is a gray-scale color
// (depth-distance from light source).
// NOTICE: with GL_TEXTURE_COMPARE_MODE GL_COMPARE_REF_TO_TEXTURE and
GL_TEXTURE_COMPARE_FUNC GL_LEQUAL, depth texture sampling color will be like above.
// so the function "textureProj()" works with the following rule:
// 1. if the color of the sampled texel is white(or black), it can be considered that this fragment is in the
// shadow;
// 2. if the color of the sampled texel is a gray-scale color, the corresponding fragment is being illuminated.
// shade normally with lighting.
// So key is to transform vertices into light projection space, project them to the near plane of the light
// Projection frustum, and then use them as texcoords, and run further steps in fragment shader with textureProj().