提问人:Arheus 提问时间:8/22/2023 最后编辑:Arheus 更新时间:8/22/2023 访问量:22
阴影贴图奇怪的结果
Shadow map weird results
问:
所以,我现在是一种实现阴影映射的方法,我坚持这个问题,即当我移动时,阴影正在发生变化。
起初,我得到了简单的阴影贴图,当相机移动时没有变化。然后我实现了级联阴影映射,开始了所有的乐趣:首先,当我实现它时,出现了这样一个问题:当我移动时,阴影会发生变化。然后我尝试实现稳定的 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。 提前致谢
答: 暂无答案
评论