I have recently implemented cascaded shadow maps and make it stable by following this post. Now everything works, except that when I move directional light to the top mid of the world, the shadow suddenly turns all dark. With some debugging I find that the light view matrix is causing the problem.
This is how I compute the view matrix:
glm::mat4 view = glm::lookAt(
center + lightDirNorm * nearOffset,
center,
camera.worldUP
);
center is the bounding sphere center, worldUP is a constant value of vec3(0.0, 1.0, 0.0), lightDirNorm is the normalized light direction from world origin to light position.
When I move light position to vec3(0.0, 20.0, 0.0), lightDirNorm becomes vec3(0.0, 1.0, 0.0). In this case, view direction is in the same line as worldUP vector. As a result, it is not possible to do cross product and compute the right vector. This is bothering because it is a common light direction.
Because the shadow is stable, the worldUP vector used here has to be something constant. The only workaround I could think of is to add a small offset to the worldUP vector, to make it like vec3(0.00001, 1.0, 0.0).
I'm wondering if there are better ways to handle that?