gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:05:06 29 4
gpt4 key购买 nike

我开始使用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源代码的情况下解决此问题?

我在Windows Vista上运行的Code::Blocks和MinGW使用的是GLM库的最新版本(0.9.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个猜测。

关于opengl - glm中矩阵值的顺序不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5097291/

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