glm中矩阵值的顺序不正确?

Posted

技术标签:

【中文标题】glm中矩阵值的顺序不正确?【英文标题】:Incorrect order of matrix values in glm? 【发布时间】:2011-02-23 21:20:35 【问题描述】:

我开始使用GLM 库在 OpenGL 3 和 GLSL 上进行数学运算。 我需要一个正交投影来绘制二维图形,所以我写了这个简单的代码:

glm::mat4 projection(1.0);
projection = glm::ortho( 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 500.0f);

在屏幕上打印 glm::ortho 创建的值我得到:

 0.00313   0.00000   0.00000   0.00000
 0.00000  -0.00417   0.00000   0.00000
 0.00000   0.00000  -0.00200   0.00000
-1.00000   1.00000  -1.00000   1.00000

据我所知,这不是 OpenGL 中值的正确顺序,因为将此矩阵乘以位置向量将忽略所有平移值。

我用我的着色器和一些原语测试了那个矩阵,我只得到一个空白屏幕。但是,如果我手动修改矩阵如下,它可以正常工作:

 0.00313   0.00000   0.00000  -1.00000
 0.00000  -0.00417   0.00000   1.00000
 0.00000   0.00000  -0.00200  -1.00000
 0.00000   0.00000   0.00000   1.00000

另外,查看“glm/gtc/matrix_transform.inl”文件中的函数“ortho”:

template <typename valType>
inline detail::tmat4x4<valType> ortho(
    valType const & left,
    valType const & right,
    valType const & bottom,
    valType const & top,
    valType const & zNear,
    valType const & zFar)

    detail::tmat4x4<valType> Result(1);
    Result[0][0] = valType(2) / (right - left);
    Result[1][1] = valType(2) / (top - bottom);
    Result[2][2] = - valType(2) / (zFar - zNear);
    Result[3][0] = - (right + left) / (right - left);
    Result[3][1] = - (top + bottom) / (top - bottom);
    Result[3][2] = - (zFar + zNear) / (zFar - zNear);
    return Result;

我已将最后 3 行初始化代码替换为以下代码,并且工作正常:

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

这是我用于测试的最小顶点着色器(请注意,此时 uni_MVP 只是上面解释的投影矩阵):

uniform mat4 uni_MVP;

in  vec2 in_Position;

void main(void)

  gl_Position = uni_MVP * vec4(in_Position.xy,0.0, 1.0);

我认为这不是错误,因为所有功能都以相同的方式工作。 也许是我的 C++ 编译器的问题,它反转了多维数组的顺序? 如何在不修改所有 GLM 源代码的情况下解决这个问题?

我正在使用最新版本的 GLM 库 (0.9.1),其中 Code::Blocks 和 MinGW 在 Windows Vista 上运行。

【问题讨论】:

【参考方案1】:

首先,它称为转置,而不是倒置。反转意味着完全不同的东西。其次,这正是它应该的样子。 OpenGL 以列主要顺序访问矩阵,即矩阵元素必须具有以下索引:

 0  4  8  12
 1  5  9  13
 2  6 10  14
 3  7 11  15

然而,你通常这样编号的 C/C++ 多维数组:

 0  1  2  3
 4  5  6  7
 8  9 10 11
12 13 14 15

即行和列索引被转置。旧版本的 OpenGL 有一些扩展,允许以转置形式提供矩阵,从而避免人们重写他们的代码。它被称为 GL_ARB_transpose_matrix http://www.opengl.org/registry/specs/ARB/transpose_matrix.txt

使用着色器比使用新功能更容易。 glUniformMatrix 有一个参数GLboolean transpose,你有 3 次猜测它的作用。

【讨论】:

谢谢你,datenwolf!通过更改 glUniformMatrix 上的转置参数修复:)

以上是关于glm中矩阵值的顺序不正确?的主要内容,如果未能解决你的问题,请参考以下文章

"glm::translate" 输出一个值不正确的矩阵

GLM 中的矩阵除法

3D Computer Grapihcs Using OpenGL - 13 优化矩阵

如何使用 glm::mat4 手动正确编写旋转矩阵?

在 Opengl 中使用矩阵的正确顺序是啥?

将 N x N 矩阵逆时针旋转 90 度。为啥填写值的顺序很重要?