gpt4 book ai didi

c++ - 来自逆 vp 矩阵和相机位置的光线方向不正确

转载 作者:行者123 更新时间:2023-11-30 04:55:59 27 4
gpt4 key购买 nike

我有一个我不明白的光线生成问题。我的光线方向计算错误。我将这段代码从 DirectX 11 移植到 Vulkan,在那里它运行良好,所以我很惊讶我无法让它运行:

vec4 farPos = inverseViewProj * vec4(screenPos, 1, 1);
farPos /= farPos.w;

r.Origin = camPos.xyz;
r.Direction = normalize(farPos.xyz - camPos.xyz);

然而这段代码完美运行:

vec4 nearPos = inverseViewProj * vec4(screenPos, 0, 1);
nearPos /= nearPos.w;
vec4 farPos = inverseViewProj * vec4(screenPos, 1, 1);
farPos /= farPos.w;

r.Origin = camPos.xyz;
r.Direction = normalize(farPos.xyz – nearPos.xyz);

[编辑] 矩阵和相机位置设置如下:

const glm::mat4 clip(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f);
projMatrix = clip * glm::perspectiveFov(FieldOfView, float(ViewWidth), float(ViewHeight), NearZ, FarZ);
viewMatrix = glm::inverse(glm::translate(glm::toMat4(Rotation), -Position));

buffer.inverseViewProjMatrix = glm::inverse(projMatrix * viewMatrix);
buffer.camPos = viewMatrix[3];

[Edit2] 如果我从原点开始,我在屏幕上看到的是正确的。但是,例如,如果我向左移动,看起来就像是向右移动。我所有的光芒似乎都被扰乱了。在某些情况下,扫射相机看起来就像我在空间中的不同点周围移动一样。我假设相机位置不等于我的透视矩阵的奇点,但我不明白为什么。

我想我误解了一些基本的东西。我错过了什么?

最佳答案

感谢评论,我发现了问题。我错误地构建了我的 View 矩阵,其方式与 this post 中的方式完全相同。 :

glm::inverse(glm::translate(glm::toMat4(Rotation), -Position));

这等于先平移再旋转,当然会导致一些不想要的东西。此外,Position 为负数,camPos 是使用 View 矩阵的最后一列而不是逆 View 矩阵获得的,这是错误的。

我的分形光线转换器并没有引起注意,因为我从未远离原点。那,以及在这样的环境中没有引用点的事实。

关于c++ - 来自逆 vp 矩阵和相机位置的光线方向不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52806882/

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