稳定级联阴影映射中的光视图矩阵

light view matrix in stable cascaded shadow mapping

我最近实现了级联阴影贴图,并按照此 post 使其稳定。现在一切正常,除了当我将定向光移动到世界的顶部中间时,阴影突然变暗。通过一些调试,我发现光视图矩阵导致了问题。

这是我计算视图矩阵的方式:

glm::mat4 view = glm::lookAt(
    center + lightDirNorm * nearOffset,
    center,
    camera.worldUP
);

center是包围球中心,worldUPvec3(0.0, 1.0, 0.0)的常数值,lightDirNorm是从世界原点到光照位置的归一化光照方向。

当我将灯光位置移动到 vec3(0.0, 20.0, 0.0) 时,lightDirNorm 变为 vec3(0.0, 1.0, 0.0)。在这种情况下,视图方向与 worldUP 向量在同一行。因此,无法进行叉积和计算 right 向量。这很麻烦,因为它是一个常见的光线方向。

因为阴影是稳定的,所以这里使用的 worldUP 向量必须是常数。我能想到的唯一解决方法是向 worldUP 向量添加一个小偏移量,使其像 vec3(0.00001, 1.0, 0.0).

我想知道是否有更好的方法来处理这个问题?

“使其稳定”不适用于方向改变的光源。稳定性是指光源静止时相机的运动。因此,您可以选择任何正交 up 向量作为 lightDirNorm 的函数,这将使您的阴影保持稳定。

我也建议 staying away from any lookAt functions。而是通过方位角和高度指定你的光方向,并使用旋转矩阵来计算视图矩阵,而不会有任何奇点的危险。