【发布时间】:2019-03-14 22:30:06
【问题描述】:
我一直在学习使用 OpenGL 编写游戏的教程(针对我正在适应 c++ 的 java),但我在转换矩阵部分遇到了问题。当我改变它的位置时,我的精灵被拉伸了:
我没有任何图形编程经验,所以我真的不知道出了什么问题。这是我的代码:
着色器:
// 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);
}
【问题讨论】:
-
通常,着色器中的乘法顺序是矩阵 * 向量而不是向量 * 矩阵,除非您转置矩阵。
-
解决了,谢谢。我认为顺序无关紧要(就像在常规乘法中一样)。
-
你应该研究一下矩阵数学。几乎所有矩阵运算中的顺序都很重要
标签: c++ opengl matrix glm-math