我一直在遵循一个教程(针对我正在适应c ++的Java)使用OpenGL编写游戏,但在翻译矩阵部分遇到了问题。更改位置时,我的子画面会拉伸:
我没有图形编程经验,所以我真的不知道出了什么问题。这是我的代码:
着色器:
// 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);
}
答案 0 :(得分:0)
着色器中的乘法顺序错误。替换
gl_Position = position * u_TransformationMatrix;
使用
gl_Position = u_TransformationMatrix * position;