From b9a007dd517072c3aa57bb24348f5630db8beccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 26 Mar 2020 23:03:49 +0100 Subject: [PATCH] Change normal matrix from 4x4 to 3x3 --- include/opengl-playground/openglgraphics.hpp | 6 +++--- include/opengl-playground/openglshader.hpp | 1 + shaders/mesh-vertex.glsl | 4 ++-- src/mesh.cpp | 2 +- src/openglgraphics.cpp | 8 +++----- src/openglshader.cpp | 8 ++++++++ 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/include/opengl-playground/openglgraphics.hpp b/include/opengl-playground/openglgraphics.hpp index f44ccfe..d0bbc30 100644 --- a/include/opengl-playground/openglgraphics.hpp +++ b/include/opengl-playground/openglgraphics.hpp @@ -15,12 +15,12 @@ class OpenGlGraphics virtual void realize() = 0; virtual void render() = 0; void setModelMatrix(const glm::mat4 &model_matrix); - glm::mat4 getModelMatrix(); - glm::mat4 getNormalMatrix(); + const glm::mat4 &getModelMatrix(); + const glm::mat3 &getNormalMatrix(); protected: std::shared_ptr shaderprog; glm::mat4 model_matrix; - glm::mat4 normal_matrix; + glm::mat3 normal_matrix; }; #endif // OPENGLGRAPHICS_H diff --git a/include/opengl-playground/openglshader.hpp b/include/opengl-playground/openglshader.hpp index e217ee3..9e0a5f3 100644 --- a/include/opengl-playground/openglshader.hpp +++ b/include/opengl-playground/openglshader.hpp @@ -21,6 +21,7 @@ class OpenGlShaderProgram void setUniformVec2(const std::string &uniform, float *vector); void setUniformVec3(const std::string &uniform, const glm::vec3 &vector); void setUniformMat4(const std::string &uniform, const glm::mat4 &matrix); + void setUniformMat3(const std::string &uniform, const glm::mat3 &matrix); void setUniformVec4(const std::string &uniform, const glm::vec4 &vector); void setUniformBool(const std::string &uniform, bool value); private: diff --git a/shaders/mesh-vertex.glsl b/shaders/mesh-vertex.glsl index 9a45ed7..7547d72 100644 --- a/shaders/mesh-vertex.glsl +++ b/shaders/mesh-vertex.glsl @@ -5,7 +5,7 @@ layout (location = 1) in vec3 aInputNormal; layout (location = 2) in vec2 aTextureCoord; uniform mat4 model_matrix; -uniform mat4 normal_matrix; +uniform mat3 normal_matrix; uniform mat4 projection_view_matrix; uniform vec3 camera_position; @@ -17,7 +17,7 @@ out vec3 ViewPos; void main() { gl_Position = projection_view_matrix * model_matrix * vec4(aInputPosition, 1.0); - Normal = vec3(normal_matrix * vec4(aInputNormal, 0.0)); + Normal = normal_matrix * aInputNormal; FragPos = vec3(model_matrix * vec4(aInputPosition, 1.0)); TexCoord = aTextureCoord; ViewPos = camera_position; diff --git a/src/mesh.cpp b/src/mesh.cpp index e8822d1..9e1712e 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -47,7 +47,7 @@ void Mesh::render(const glm::mat4 &model_matrix, const glm::mat4 &normal_matrix) { this->shaderprog->use(); this->shaderprog->setUniformMat4("model_matrix", model_matrix); - this->shaderprog->setUniformMat4("normal_matrix", normal_matrix); + this->shaderprog->setUniformMat3("normal_matrix", normal_matrix); this->shaderprog->setUniformMat4("projection_view_matrix", GlobalCanvasSettings::getPVMatrix()); this->shaderprog->setUniformVec3("camera_position", GlobalCanvasSettings::getCameraPosition()); diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp index 5a0d706..12d3f1e 100644 --- a/src/openglgraphics.cpp +++ b/src/openglgraphics.cpp @@ -1,7 +1,5 @@ #include - - OpenGlGraphics::OpenGlGraphics(std::shared_ptrshader_prog) { this->shaderprog = shader_prog; @@ -16,15 +14,15 @@ OpenGlGraphics::~OpenGlGraphics() void OpenGlGraphics::setModelMatrix(const glm::mat4 &model_matrix) { this->model_matrix = model_matrix; - this->normal_matrix = glm::transpose(glm::inverse(model_matrix)); + this->normal_matrix = glm::mat3(glm::transpose(glm::inverse(model_matrix))); } -glm::mat4 OpenGlGraphics::getModelMatrix() +const glm::mat4 &OpenGlGraphics::getModelMatrix() { return this->model_matrix; } -glm::mat4 OpenGlGraphics::getNormalMatrix() +const glm::mat3 &OpenGlGraphics::getNormalMatrix() { return this->normal_matrix; } diff --git a/src/openglshader.cpp b/src/openglshader.cpp index 0b1c8ca..91d52dc 100644 --- a/src/openglshader.cpp +++ b/src/openglshader.cpp @@ -200,6 +200,14 @@ void OpenGlShaderProgram::setUniformMat4(const std::string &uniform, const glm:: } } +void OpenGlShaderProgram::setUniformMat3(const std::string &uniform, const glm::mat3 &matrix) +{ + int loc = this->getUniformLoc(uniform); + if (loc >= 0) { + glUniformMatrix3fv(loc, 1, GL_FALSE, &matrix[0][0]); + } +} + void OpenGlShaderProgram::setUniformVec4(const std::string &uniform, const glm::vec4 &vector) { int loc = this->getUniformLoc(uniform);