diff --git a/res/shaders/basic.fs b/res/shaders/basic.fs index 17d4bc7..7427bde 100644 --- a/res/shaders/basic.fs +++ b/res/shaders/basic.fs @@ -9,19 +9,47 @@ struct Material { sampler2D u_texture_specular1; }; +in vec3 v_normal; in vec4 v_color; in vec2 v_texCoord; -uniform vec3 v_objectColor; -uniform vec3 v_lightColor; +in vec3 v_fragmentPosition; + +uniform vec3 u_objectColor; + +uniform vec3 u_lightPosition; +uniform vec3 u_lightColor; + +uniform mat3 u_normalMatrix; + +uniform vec3 u_viewPosition; uniform Material material; void main() { + float ambientStrength = 0.1f; + float specularStrength = 0.5; + + vec3 ambient = ambientStrength * u_lightColor; + + // Diffuse lighting + vec3 normal = normalize(u_normalMatrix * v_normal); + vec3 lightDir = normalize(u_lightPosition - v_fragmentPosition); + float diff = max(dot(normal, lightDir), 0.0f); + vec3 diffuse = diff * u_lightColor; + + // Specular lighting + vec3 viewDir = normalize(u_viewPosition - v_fragmentPosition); + vec3 reflectDir = reflect(-lightDir, normal); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); + vec3 specular = specularStrength * spec * u_lightColor; + //f_color = v_color; - vec4 texColor1 = texture(material.u_texture_diffuse0, v_texCoord); + //vec4 texColor1 = texture(material.u_texture_diffuse0, v_texCoord); //vec4 texColor2 = texture(material.u_texture_diffuse1, v_texCoord); - //f_color = vec4(v_objectColor * v_lightColor, 1.0f); - f_color = texColor1; + //f_color = texColor1; + + + f_color = vec4((ambient + diffuse + specular) * u_objectColor, 1.0f); } diff --git a/res/shaders/basic.vs b/res/shaders/basic.vs index 4e415be..877a8ec 100644 --- a/res/shaders/basic.vs +++ b/res/shaders/basic.vs @@ -1,16 +1,25 @@ #version 330 core layout(location = 0) in vec3 a_position; -layout(location = 1) in vec2 a_texCoord; -layout(location = 2) in vec4 a_color; +layout(location = 1) in vec3 a_normal; +layout(location = 2) in vec2 a_texCoord; +layout(location = 3) in vec4 a_color; -out vec4 v_color; +out vec3 v_normal; out vec2 v_texCoord; +out vec4 v_color; -uniform mat4 u_modelViewProj; +out vec3 v_fragmentPosition; + +uniform mat4 u_modelViewProjMatrix; +uniform mat4 u_modelMatrix; void main() { - gl_Position = u_modelViewProj * vec4(a_position, 1.0f); + gl_Position = u_modelViewProjMatrix * vec4(a_position, 1.0f); + + v_fragmentPosition = vec3(u_modelMatrix * vec4(a_position, 1.0f)); + + v_normal = a_normal; v_texCoord = a_texCoord; v_color = a_color; } diff --git a/res/shaders/light.vs b/res/shaders/light.vs index 4e415be..c5f16ed 100644 --- a/res/shaders/light.vs +++ b/res/shaders/light.vs @@ -7,10 +7,10 @@ layout(location = 2) in vec4 a_color; out vec4 v_color; out vec2 v_texCoord; -uniform mat4 u_modelViewProj; +uniform mat4 u_modelViewProjMatrix; void main() { - gl_Position = u_modelViewProj * vec4(a_position, 1.0f); + gl_Position = u_modelViewProjMatrix * vec4(a_position, 1.0f); v_texCoord = a_texCoord; v_color = a_color; } diff --git a/src/Camera.cpp b/src/Camera.cpp index 42bd37c..449a3a7 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -11,10 +11,6 @@ Camera::Camera(float fov, int width, int height) { updateVPM(); } -glm::mat4 Camera::getViewProj() { - return viewProjectionMatrix; -} - void Camera::updateVPM() { viewProjectionMatrix = projectionMatrix * viewMatrix; } diff --git a/src/Camera.h b/src/Camera.h index 62ef1e4..5cc6d27 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -9,7 +9,6 @@ public: Camera(float fov, int width, int height); ~Camera() = default; - glm::mat4 getViewProj(); void updateVPM(); void updateAspectRatio(int width, int height); void updatePositionFromKeyboardInput(bool *actionCameraRegister, float deltaTime); @@ -21,6 +20,8 @@ public: void lookAtTarget(glm::vec3 target); void lookForward(); + glm::mat4 getViewProj() { return viewProjectionMatrix; } + glm::vec3 getPosition() { return position; } private: diff --git a/src/Controller.cpp b/src/Controller.cpp index 678905f..570e1b6 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -49,15 +49,29 @@ void Controller::run() { std::vector scene; - //Model model_backpack("res/models/backpack.obj"); + Model model_backpack("res/models/backpack.obj"); Model model_cube("res/models/cube.obj"); + Model model_sphere("res/models/sphere.obj"); //Entity backpack1(&model_backpack, &shaderProgram); - Entity cube(&model_cube, &shaderProgram); + Entity cube(&model_backpack, &shaderProgram); + Entity sphere(&model_sphere, &shaderProgram); Entity lightSource(&model_cube, &lightProgram); - //scene.push_back(backpack1); + sphere.translate(glm::vec3(5.0f, 0.0f, 2.5f)); + + lightSource.translate(glm::vec3(-5.0f, 1.0f, 0.0f)); + lightSource.scale(0.2f); + + shaderProgram.bind(); + shaderProgram.setUniform("u_lightPosition", lightSource.getPosition()); + shaderProgram.setUniform("u_objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); + shaderProgram.setUniform("u_lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); + shaderProgram.unbind(); + + scene.push_back(lightSource); scene.push_back(cube); + scene.push_back(sphere); camera->translate(glm::vec3(0.0f, 0.0f, 7.5f)); @@ -83,8 +97,11 @@ void Controller::run() { camera->lookForward(); camera->updateVPM(); + for(auto it = scene.begin(); it != scene.end(); it++) { + it->draw(camera->getViewProj(), camera->getPosition()); + } //backpack1.draw(camera->getViewProj()); - cube.draw(camera->getViewProj()); + //cube.draw(camera->getViewProj()); glfwSwapBuffers(gameWindow->getGLFWwindow()); diff --git a/src/Entity.cpp b/src/Entity.cpp index 5e80bad..4c7ca9d 100644 --- a/src/Entity.cpp +++ b/src/Entity.cpp @@ -10,10 +10,23 @@ Entity::Entity(Model *model, ShaderProgram *shaderProgram) } -void Entity::draw(glm::mat4 viewProjMatrix) { +void Entity::draw(glm::mat4 viewProjMatrix, glm::vec3 viewPosition) { + shaderProgram->bind(); + glm::mat4 modelViewProj = viewProjMatrix * modelMatrix; - shaderProgram->setUniform("u_modelViewProj", modelViewProj); + shaderProgram->setUniform("u_modelViewProjMatrix", modelViewProj); + + shaderProgram->setUniform("u_modelMatrix", modelMatrix); + + glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(modelMatrix))); + shaderProgram->setUniform("u_normalMatrix", normalMatrix); + + shaderProgram->setUniform("u_viewPosition", viewPosition); + + // Draw the model model->draw(shaderProgram); + + shaderProgram->unbind(); } void Entity::translate(glm::vec3 vector) { @@ -23,4 +36,9 @@ void Entity::translate(glm::vec3 vector) { void Entity::rotate(glm::vec3 axis, float radians) { modelMatrix = glm::rotate(modelMatrix, radians, axis); +} + +void Entity::scale(float scaleFactor) { + modelScale = scaleFactor; + modelMatrix = glm::scale(modelMatrix, glm::vec3(scaleFactor, scaleFactor, scaleFactor)); } \ No newline at end of file diff --git a/src/Entity.h b/src/Entity.h index 699e3ec..c269d6b 100644 --- a/src/Entity.h +++ b/src/Entity.h @@ -11,10 +11,14 @@ public: Entity(Model *model, ShaderProgram *shaderProgram); ~Entity() = default; - void draw(glm::mat4 viewProjMatrix); + void draw(glm::mat4 viewProjMatrix, glm::vec3 viewPosition); void translate(glm::vec3 vector); void rotate(glm::vec3 axis, float radians); + void scale(float scaleFactor); + + glm::vec3 getPosition() { return position; } + glm::mat4 getModelMatrix() { return modelMatrix; } @@ -27,6 +31,8 @@ private: glm::vec3 orientation = glm::vec3(0.0f, 1.0f, 0.0f); glm::vec3 velocity = glm::vec3(0.0f, 0.0f, 0.0f); + float modelScale = 1.0f; + Model *model; glm::mat4 modelMatrix = glm::mat4(1.0f); diff --git a/src/ShaderProgram.cpp b/src/ShaderProgram.cpp index 52b6b09..1f53bfb 100644 --- a/src/ShaderProgram.cpp +++ b/src/ShaderProgram.cpp @@ -111,6 +111,11 @@ void ShaderProgram::setUniform(const char *name, glm::vec3 vector) const { glUniform3f(location, vector.x, vector.y, vector.z); } +void ShaderProgram::setUniform(const char *name, glm::mat3 matrix) const { + GLint location = glGetUniformLocation(shaderProgramId, name); + glUniformMatrix3fv(location, 1, GL_FALSE, glm::value_ptr(matrix)); +} + void ShaderProgram::setUniform(const char *name, glm::mat4 matrix) const { GLint location = glGetUniformLocation(shaderProgramId, name); glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(matrix)); diff --git a/src/ShaderProgram.h b/src/ShaderProgram.h index 3c2b4f9..8062570 100644 --- a/src/ShaderProgram.h +++ b/src/ShaderProgram.h @@ -19,6 +19,7 @@ public: void setUniform(const char *name, int value) const; void setUniform(const char *name, float value) const; void setUniform(const char *name, glm::vec3 vector) const; + void setUniform(const char *name, glm::mat3 matrix) const; void setUniform(const char *name, glm::mat4 matrix) const; GLuint getShaderProgramId() { return shaderProgramId; } diff --git a/src/VertexBuffer.cpp b/src/VertexBuffer.cpp index 1b9318d..9385781 100644 --- a/src/VertexBuffer.cpp +++ b/src/VertexBuffer.cpp @@ -20,13 +20,13 @@ VertexBuffer::VertexBuffer(void *vertexData, void *indexData, uint32_t numVertic glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(struct Vertex, position)); - // UV Texture Mapping - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(struct Vertex, textureCoords)); - // Normal vectors + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(struct Vertex, normalVec)); + + // UV Texture Mapping glEnableVertexAttribArray(2); - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(struct Vertex, normalVec)); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(struct Vertex, textureCoords)); // Color glEnableVertexAttribArray(3);