OpenGL & GLM 转换矩阵拉伸

OpenGL & GLM Translation matrix stretched

我一直在学习使用 OpenGL 编写游戏的教程(针对 java,我正在将其改编为 C++),但我在转换矩阵部分遇到了问题。当我改变它的位置时,我的精灵被拉伸:

位置 {-1.0f, 0.0f, 0.0f}

位置{0, 0, 0}

我没有任何图形编程经验,所以我真的不知道出了什么问题。这是我的代码:

着色器:

// VERTEX
#shader vertex
#version 330 core

layout(location = 0) in vec4 position;
layout(location = 1) in vec2 texCoord;

out vec2 v_TexCoord;


uniform mat4 u_TransformationMatrix;

void main() {
    gl_Position = position * u_TransformationMatrix;
    v_TexCoord = texCoord;
};

// FRAGMENT
#shader fragment
#version 330 core

layout(location = 0) out vec4 color;

in vec2 v_TexCoord;

uniform vec4 u_Color;
uniform  sampler2D u_Texture;

void main() {
    vec4 texColor = texture(u_Texture, v_TexCoord);
    color = texColor;
};

矩阵的计算:

static glm::mat4 createTransformationMatrix(glm::vec3 translation, glm::vec3 rotation, float scale) {
    glm::mat4 matrix(1.f);

    matrix = glm::translate(matrix, translation);
    matrix = glm::rotate(matrix, glm::radians(rotation.x), glm::vec3(1.f, 0.f, 0.f));
    matrix = glm::rotate(matrix, glm::radians(rotation.y), glm::vec3(0.f, 1.f, 0.f));
    matrix = glm::rotate(matrix, glm::radians(rotation.z), glm::vec3(0.f, 0.f, 1.f));
    matrix = glm::scale(matrix, glm::vec3(scale));


    return matrix;
}

渲染代码:

void Render(const Renderer &renderer, Shader *shader) {
    shader->SetUniformMatrix4f("u_TransformationMatrix", Math::createTransformationMatrix(position, rotation, scale));
    model.Render(renderer, *shader);
}

纹理加载代码:

Texture::Texture(const std::string & path, bool useTiling) : m_RendererId(0), m_FilePath(path), m_LocalBuffer(nullptr), m_Width(0), m_Height(0), m_BPP(0)
{
    stbi_set_flip_vertically_on_load(false);
    m_LocalBuffer = stbi_load(path.c_str(), &m_Width, &m_Height, &m_BPP, 4/*RGBA*/);
    glGenTextures(1, &m_RendererId);
    glBindTexture(GL_TEXTURE_2D, m_RendererId);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, useTiling ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, useTiling ? GL_REPEAT : GL_CLAMP_TO_EDGE);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Width, m_Height, 0/*b*/, GL_RGBA, GL_UNSIGNED_BYTE, m_LocalBuffer);

    glBindTexture(GL_TEXTURE_2D, 0);

    if (m_LocalBuffer)
        stbi_image_free(m_LocalBuffer);
}

着色器中的乘法顺序错误。替换

gl_Position = position * u_TransformationMatrix;

gl_Position = u_TransformationMatrix * position;

Matrix multiplications are not commutative.