为什么 glm::frustumLH_ZO 的值 [2][0] 和 [2][1] 取反?

Why values [2][0] and [2][1] of glm::frustumLH_ZO are negated?

假设我来自左撇子世界space。我的正Z入屏,我的Y向上,和OpenGL在clip里默认的一样space.

据我了解,当来自右手世界时 space(在使用旧函数(例如将前向向量映射到 -Z 轴的 gluLookAt 时有点需要)时,Z co在计算投影矩阵 (orthographic/perspective) 之前翻转 -ordinated。这是因为右手系统在屏幕上会有负 Z,在传递给 OpenGL 之前需要翻转。

我已经确认,对于 orthoLH_ZO 这样的函数,不会发生翻转。事实上,矩阵是一个“标准”正交投影,也适用于例如。 Vulkan 即它保持惯用手(除了 Y 会在 Vulkan 中向下所以底部和顶部会切换)。

因此我希望 glm::frustumLH_ZO 也是这样一个“标准”矩阵,因为不需要进行翻转。但是,在查看其源代码时,元素 [2][0] 和 [2][1] 与例如相比被取反。 Vulkan 的平截头体透视投影矩阵(在 11:49 处讨论 here)。

这些元素是:

Result[2][0] = (right + left) / (right - left);
Result[2][1] = (top + bottom) / (top - bottom);

而不是我的预期:

Result[2][0] = -(right + left) / (right - left);
Result[2][1] = -(top + bottom) / (top - bottom);

我不认为这是由于 Z 形翻转造成的,因为这也应该导致例如元素 [2][3] 为 -1 而不是 +1。

为什么矩阵中的这些条目会翻转?

Why are these entries in the matrix flipped?

你是对的,他们不应该,but they are in the most recent glm code base to date。看起来你在 glm 中发现了一个错误。它可能没有被注意到这么久,因为 a) 大多数人使用带有默认 GL 约定的 glm,以及 b) 这两个元素在标准对称平截头体中通常为 0(left = -righttop = -bottom)。