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