扩展了OpenGL和GLM翻译矩阵

时间:2018-10-10 05:09:31

标签: c++ opengl matrix glm-math

我一直在遵循一个教程(针对我正在适应c ++的Java)使用OpenGL编写游戏,但在翻译矩阵部分遇到了问题。更改位置时,我的子画面会拉伸:

正数{-1.0f,0.0f,0.0f} enter image description here

位置{0,0,0} enter image description here

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

着色器:

// 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);
}

1 个答案:

答案 0 :(得分:0)

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

gl_Position = position * u_TransformationMatrix;

使用

gl_Position = u_TransformationMatrix * position;

Matrix multiplications不是commutative