C++ OpenGL顶点着色器:奇怪的矩阵转换

C++ OpenGL顶点着色器:奇怪的矩阵转换,c++,opengl,matrix,vertex-shader,C++,Opengl,Matrix,Vertex Shader,我试着用矩阵移动一个基于时间的三角形。但它做了一些奇怪的事情: 它应该做什么: 在x轴上移动 它的作用: 三角形的顶点是固定的,其他点似乎围绕着它做圆周运动,并在x、z轴上缩放(我仍然在2d中,所以我没有深度) 我的C++代码: ... GLfloat timeValue = glfwGetTime(); GLfloat offset = (sin(timeValue * 4) / 2); GLfloat matrix[16] = { 1, 0

我试着用矩阵移动一个基于时间的三角形。但它做了一些奇怪的事情:

它应该做什么: 在x轴上移动

它的作用: 三角形的顶点是固定的,其他点似乎围绕着它做圆周运动,并在x、z轴上缩放(我仍然在2d中,所以我没有深度)

<>我的C++代码:

    ...
    GLfloat timeValue = glfwGetTime();
    GLfloat offset = (sin(timeValue  * 4) / 2);

    GLfloat matrix[16] = {
        1, 0, 0, offset,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    };

    GLuint uniform_m_transform = glGetUniformLocation(shader_program, "m_transform");
    glUniformMatrix4fv(uniform_m_transform, 1, GL_FALSE, matrix);
    ...
我的顶点着色器:

#version 330 core
 layout (location = 0) in vec3 position;
 layout (location = 1) in vec3 color;

 out vec3 ourColor;
 uniform mat4 m_transform;

 void main()
 {
     ourColor = color;
     gl_Position = m_transform * vec4(position, 1.0);
 }
我不知道我做错了什么,根据教程,我设置为偏移的矩阵属性应该会更改x平移


你知道我犯了什么错吗

您提供的是行主矩阵,因此需要指定转置:

glUniformMatrix4fv(uniform_m_transform, 1, GL_TRUE, matrix);

参考:,检查转置参数。

您提供的是行主矩阵,因此需要指定转置:

glUniformMatrix4fv(uniform_m_transform, 1, GL_TRUE, matrix);

参考:,检查转置参数。

非常感谢!现在它工作了!谢谢你的链接:)@yxyx136:它详细说明了矩阵元素的读取顺序。行顺序意味着,构成矩阵的基向量(记住,矩阵是向量的向量)首先按行索引,然后按列索引)。然而,OpenGL本机假设,缓冲区中构成矩阵的元素先按列排序;因此,当将其写入C数组时,它看起来是转置的(沿对角线翻转)。虽然这在一开始看起来很麻烦,但在计算机图形学方面,它有一定的好处,因为通常你需要处理矩阵的列向量,例如制作广告牌。谢谢你的帮助!,丹克!非常感谢你!现在它工作了!谢谢你的链接:)@yxyx136:它详细说明了矩阵元素的读取顺序。行顺序意味着,构成矩阵的基向量(记住,矩阵是向量的向量)首先按行索引,然后按列索引)。然而,OpenGL本机假设,缓冲区中构成矩阵的元素先按列排序;因此,当将其写入C数组时,它看起来是转置的(沿对角线翻转)。虽然这在一开始看起来很麻烦,但在计算机图形学方面,它有一定的好处,因为通常你需要处理矩阵的列向量,例如制作广告牌。谢谢你的帮助!,丹克!