Странное поведение MVP во время перевода - PullRequest
1 голос
/ 08 марта 2020

Я изучаю основы OpenGL и пытаюсь перевести треугольник с орто-проекцией. Я не вижу того, что ожидаю, что я делаю неправильно?

Мой буфер вершин:

Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
Vertices[2] = Vector3f(-1.0f, 1.0f, 0.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

Вершинный шейдер:

#version 330

layout (location = 0) in vec3 Position;

uniform mat4 gMVP;

void main()
{
    gl_Position = gMVP * vec4(Position, 1.0);
}

Расчет и рендеринг MVP :

    glm::mat4 p = glm::ortho(-2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);
    glm::mat4 v = glm::lookAt(glm::vec3(0,0,1), glm::vec3(0,0,0), glm::vec3(0,1,0)); 
    glm::mat4 m = glm::translate(glm::mat4(1.0f), glm::vec3(0.5f, 0.0f, 0.0f));
    glm::mat4 MVP = p * v * m; 

    glUniformMatrix4fv(gMVPLocation, 1, GL_TRUE, &MVP[0][0]);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);

    glutSwapBuffers();

результат:

enter image description here

Разве он не должен просто двигаться вправо вдоль оси X?

1 Ответ

3 голосов
/ 08 марта 2020

3-й параметр glUniformMatrix4fv приводит к тому, что матрица будет транспонирована, когда она установлена ​​в униформу. Математика OpenGL (GLM) создает матрицы таким же образом, как GLSL создает переменные типа mat4.
Матрица не должна быть транспонирована, когда она установлена ​​в униформу:

glUniformMatrix4fv(gMVPLocation, 1, GL_TRUE, &MVP[0][0]);

glUniformMatrix4fv(gMVPLocation, 1, GL_FALSE, &MVP[0][0]);

В GLSL вектор должен быть умножен на матрицу справа. См. Программирование GLSL / Векторные и матричные операции

...