逆vp矩阵和相机位置的光线方向不正确

时间:2018-10-14 20:37:04

标签: c++ glsl raytracing vulkan compute-shader

我的射线世代有一个我不明白的问题。我射线的方向计算错误。我将这段代码从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]如果我从原点开始,则在屏幕上看到的内容是正确的。但是,例如,如果我向左移动,就好像我向右移动一样。我所有的光线似乎都被打扰了。在某些情况下,扫视相机看起来就像是我在空间的另一个点上移动一样。我假设相机位置不等于我的透视矩阵的奇点,但我不知道为什么。

我认为我误解了一些基本知识。我想念什么?

1 个答案:

答案 0 :(得分:1)

多亏了我发现问题的评论。我用与this post中完全相同的方式错误地构建了视图矩阵:

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

这等同于首先平移然后旋转,这当然会导致某些不必要的事情。另外,Position为负,并且camPos是使用视图矩阵的最后一列而不是逆视图矩阵获得的,这是错误的。

我的分形射线投射器根本就没注意到它,因为我从未远离原点。那,以及在这样的环境中没有参考点的事实。