gpt4 book ai didi

c++ - 稳定的阴影贴图

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:44 25 4
gpt4 key购买 nike

我正在尝试稳定我的 3D 渲染器中的阴影。我正在使用 CSM。

这是我得到的代码,没有尝试稳定。世界空间中投影的大小至少应该保持不变:

void SkyLight::update() {
// direction is the direction that the light is facing
vec3 tangent = sq::make_tangent(direction);

for (int i = 0; i < 4; i++) {
// .first is the far plane, .second is a struct of 8 vec3 making a world space camera frustum
const std::pair<float, sq::Frustum>& csm = camera->csmArr[i];

// calculates the bounding box centre of the frustum
vec3 frusCentre = sq::calc_frusCentre(csm.second);

mat4 viewMat = glm::lookAt(frusCentre-direction, frusCentre, tangent);
mat4 projMat = glm::ortho(-csm.first, csm.first, -csm.first, csm.first, -csm.first, csm.first);
matArr[i] = projMat * viewMat;
}
}

行得通。但是,影子却在疯狂地闪烁和游动。因此,这里尝试通过尝试将它们捕捉到纹素大小的增量来稳定,就像到处都推荐但似乎从未解释过的那样:

void SkyLight::update() {
vec3 tangent = sq::make_tangent(direction);

for (int i = 0; i < 4; i++) {
const std::pair<float, sq::Frustum>& csm = camera->csmArr[i];

vec3 frusCentre = sq::calc_frusCentre(csm.second);

double qStep = csm.first / 1024.0; // shadow texture size
frusCentre.x = std::round(frusCentre.x / qStep) * qStep;
frusCentre.y = std::round(frusCentre.y / qStep) * qStep;
frusCentre.z = std::round(frusCentre.z / qStep) * qStep;

mat4 viewMat = glm::lookAt(frusCentre-direction, frusCentre, tangent);
mat4 projMat = glm::ortho(-csm.first, csm.first, -csm.first, csm.first, -csm.first, csm.first);
matArr[i] = projMat * viewMat;
}
}

这有所不同,因为阴影现在游动得很慢,而不是弹跳得太快而无法注意到任何图案。但是,我很确定这只是偶然,我根本没有捕捉到正确的东西,甚至没有捕捉到正确的东西。

最佳答案

要解决这个问题,我需要在光照空间而不是世界空间中进行捕捉:

viewMat[3][0] -= glm::mod(viewMat[3][0], 2.f * split / texSize);
viewMat[3][1] -= glm::mod(viewMat[3][1], 2.f * split / texSize);
viewMat[3][2] -= glm::mod(viewMat[3][2], 2.f * split / texSize);

旧(错误)答案:

所以,我今天重新审视了这个问题,并设法在大约 10 分钟内解决了它 :D

像这样围绕 frusCentre:

frusCentre -= glm::mod(frusCentre, 2.f * csm.first / 1024.f);

或者,更一般地说:

frusCentre -= glm::mod(frusCentre, 2.f * split / texSize);

编辑:不,那不好...我会继续尝试。

关于c++ - 稳定的阴影贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29557752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com