阴影贴图奇怪的结果

Shadow map weird results

提问人:Arheus 提问时间:8/22/2023 最后编辑:Arheus 更新时间:8/22/2023 访问量:22

问:

所以,我现在是一种实现阴影映射的方法,我坚持这个问题,即当我移动时,阴影正在发生变化。

起初,我得到了简单的阴影贴图,当相机移动时没有变化。然后我实现了级联阴影映射,开始了所有的乐趣:首先,当我实现它时,出现了这样一个问题:当我移动时,阴影会发生变化。然后我尝试实现稳定的 csm(使用基于边界球体和纹素的位移而不是基于像素的位移),但问题仍然存在(我认为稳定的 csm 会修复它)。我正在使用 NearZ=0.01 和 FarZ=100(我得到了像 0.01、3.527)、(3.527、10.844)、(10.844、100.0))这样的视锥体分裂),所以我认为这将是 z 战斗,但是,我想,它根本不是 z 战斗。

这是我的轻量级代码片段,但我提供以防万一,以防万一。 这就是我制作矩阵的方式,但最多看起来不错。但我相信,也许,问题可能出在产生光线透视上

glm::vec3 lightPos = glm::vec3(-4, 4, 2);
glm::vec3 lightDir = glm::normalize(-lightPos);
glm::mat4 cameraView    = glm::lookAt(cameraPos, cameraPos + cameraDir, glm::vec3(0, 1, 0));
glm::mat4 cameraPersp   = glm::perspectiveRH_ZO(70.0, 1240.0 / 720.0, 0.001, 100.0);
glm::mat4 cameraInverse = glm::inverse(cameraPersp * cameraView);

std::vector<glm::vec4> cameraCorners = 
{
    // Near
    glm::vec4{-1.0f, -1.0f, 0.0f, 1.0f},
    glm::vec4{ 1.0f, -1.0f, 0.0f, 1.0f},
    glm::vec4{ 1.0f,  1.0f, 0.0f, 1.0f},
    glm::vec4{-1.0f,  1.0f, 0.0f, 1.0f},
    // Far
    glm::vec4{-1.0f, -1.0f, 1.0f, 1.0f},
    glm::vec4{ 1.0f, -1.0f, 1.0f, 1.0f},
    glm::vec4{ 1.0f,  1.0f, 1.0f, 1.0f},
    glm::vec4{-1.0f,  1.0f, 1.0f, 1.0f},
};

for(size_t i = 0; i < 8; i++)
{
    cameraCorners[i] = cameraInverse * cameraCorners[i];
    cameraCorners[i] = cameraCorners[i] / cameraCorners[i].w;
}

glm::vec3 center(0);
for(glm::vec3 V : cameraCorners)
{
    center += V;
}
center /= 8.0;
float radius = 0.0f;
for(size_t i = 0; i < 8; i++)
{
    float dist = glm::length(glm::vec3(cameraCorners[i]) - center);
    radius = Max(radius, dist);
}
radius = std::ceil(radius);

glm::mat4 lightView = glm::lookAt(center - lightDir, center, glm::vec3(0, 1, 0));

glm::vec3 maxExt = center + radius;
glm::vec3 minExt = center - radius;
maxExt = lightView * glm::vec4(maxExt, 1.0);
minExt = lightView * glm::vec4(minExt, 1.0);
glm::mat4 lightProj = glm::orthoRH_ZO(minExt.x, maxExt.x, minExt.y, maxExt.y, minExt.z, maxExt.z);

有一个用于问题可视化的 gif。 提前致谢

数学 图形 GLM

评论


答: 暂无答案