I have a simulation software where the user can set the camera parameters such as the field of view. If the field of view is about 90°, the cascaded shadow images fit perfectly, as in Figure 1.
Figure 1: Three shadow cascades on a 90° FoV.
However, if the field of view is very small, most of the pixels of the shadow map are outside the frustum. See figure 2.
Figure 2: Three shadow cascades on a very small FoV.
I played around a bit and figured that this problem could be easily solved by changing the projections of the shadow map to fit better into the frustum (see Figure 3).
Figure 3: The three shadow cascades are scaled in order to better adapt them to the frustum.
Then I noticed that the shadow flickers when you move / rotate the camera. So the cascades have to be aligned in a voxel grid, and when you move / rotate the camera, the cascade jumps to the neighboring grid cell. From now on, the cascades are no longer rotated. This works very well for square cascades and large fields of views. However, this is not possible for scaled cascades.
So I came up with the idea of using many more cascades with a lower shadow map resolution (see Figure 4)
Figure 4: Many square shadow cascades on a very small FoV.
I haven't tested it now because there are so many things to change in the code, but I think the downside is that if the sun and the camera are aligned the same (directly behind the camera), the geometry that is close to the camera will be projected onto all the shadow maps. Due to the high number of shadow maps, this would slow down my renderings.
At the moment I have a texture2D_Array assigned to my framebuffer, and within the geometry shader the triangles are duplicated via the shadow cascades.
What is the best way to cascade shadows when the field of view is small? How to deal with telephoto lenses? (FoV < 1°). Or is there a better algorithm than cascaded shadow mapping? (should work without raytracing)