我开始使用GLM库通过OpenGL 3和GLSL进行数学运算。 我需要一个正交投影来绘制2D图形,所以我写了这个简单的代码:
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),在Windows Vista上运行Code :: Blocks和MinGW。
答案 0 :(得分:21)
首先,它被称为换位,而不是倒置。倒置意味着完全不同的东西。其次,这正是它应该如何。 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个猜测它的作用。