gpt4 book ai didi

c++ - GLSL 和 GLM 之间的矩阵数学不一致,或者是否存在诸如 "bad" View 矩阵之类的东西

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:17 30 4
gpt4 key购买 nike

所以,我遇到了 GLSL 和 GLM 之间的一些奇怪之处。

如果我生成以下 View 矩阵 (C++):

vec3 pos(4, 1, 1);
vec3 dir(1, 0, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));

然后,在 glsl 中,执行:

fragColour.rgb = vec3(inverse(viewMat) * vec4(0,0,0,1)) / 4.f;

然后我希望屏幕变成粉红色,或 (1.0,0.25,0.25)。相反,我变黑了。

但是,如果我在 GLM 中这样做:

vec3 colour = vec3(glm::inverse(viewMat) * vec4(0,0,0,1)) / 4.f;
cout << glm::to_string(colour) << endl;

我得到了 (1.0,0.25,0.25) 的预期结果。

现在,如果我将 viewMat 更改为 (C++):

vec3 pos(4, 1, 1);
vec3 dir(1, 0.000001, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));

然后砰!我在 GLSL 和 GLM 中都得到 (1.0,0.25,0.25)。

这对我来说毫无意义。为什么要这样做?这个 View 矩阵在 GLSL 的其他任何地方都可以正常工作——我只是不能反转它。只要 dirY == 0.f 就会发生这种情况。

此外,请对问题标题提出改进建议,我不确定它应该是什么。

编辑:此外,它似乎与 lookAt 的向上 vector (无论如何我都设置为 Z)没有任何关系。即使我设置为 (0,1,0),也会发生同样的事情。一切都转向一边,但我仍然无法在 GLSL 中反转 View 矩阵。

编辑:好的,所以在 derhass 的建议下,我已经尝试以倒置的方式发送 View 矩阵。砰,完美的工作。因此,似乎我的 GL 实现确实无法以某种方式反转该矩阵。这很容易成为我遇到过的最奇怪的 GL 错误。不过,对于为什么在着色器中反转矩阵是一个坏主意的某种解释,我们将不胜感激。 EditAgain:在我的引擎中发送倒置矩阵导致帧率大幅提升。一定要这样做。

最佳答案

任意 4x4 矩阵求逆不是一项快速且安全的任务

由于许多原因,例如 GPU 端的 FPU 精度较低以及在求逆过程中需要进行多次除法(这取决于计算方法),并且并非所有矩阵都具有逆等(我认为这也是 GL 具有的原因也没有这样的实现)...有关此的更好图像,请参见Understanding 4x4 homogenous transform matrices并在其中查找 matrix_inv 函数计算的真正复杂程度(它使用行列式)。还有 GEM(高斯消元法),但由于它的怪癖和需要对行进行排序而未被使用 ...

如果每帧渲染的矩阵都是静态的(通常是这种情况),那么在顶点/片段/几何着色器中一次又一次地为每个顶点/片段计算它是一种 GPU 能力的浪费(这就是速度提升的原因) .

有人可能会反对 orthogonal homogenous matrix求逆只是转置矩阵,但 GL/GLSL 如何知道它处理这样的矩阵(检查也不是那么简单)无论如何在这种情况下你可以使用 transpose ,它在 GLSL 中实现并且应该很快(这只是元素的重新排序)

关于c++ - GLSL 和 GLM 之间的矩阵数学不一致,或者是否存在诸如 "bad" View 矩阵之类的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29576891/

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