稳定级联阴影映射中的光视图矩阵
light view matrix in stable cascaded shadow mapping
我最近实现了级联阴影贴图,并按照此 post 使其稳定。现在一切正常,除了当我将定向光移动到世界的顶部中间时,阴影突然变暗。通过一些调试,我发现光视图矩阵导致了问题。
这是我计算视图矩阵的方式:
glm::mat4 view = glm::lookAt(
center + lightDirNorm * nearOffset,
center,
camera.worldUP
);
center
是包围球中心,worldUP
是vec3(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。而是通过方位角和高度指定你的光方向,并使用旋转矩阵来计算视图矩阵,而不会有任何奇点的危险。
我最近实现了级联阴影贴图,并按照此 post 使其稳定。现在一切正常,除了当我将定向光移动到世界的顶部中间时,阴影突然变暗。通过一些调试,我发现光视图矩阵导致了问题。
这是我计算视图矩阵的方式:
glm::mat4 view = glm::lookAt(
center + lightDirNorm * nearOffset,
center,
camera.worldUP
);
center
是包围球中心,worldUP
是vec3(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。而是通过方位角和高度指定你的光方向,并使用旋转矩阵来计算视图矩阵,而不会有任何奇点的危险。