From bd2df7e928dd197912ee3f2fe5450d013147f65f Mon Sep 17 00:00:00 2001 From: 4VRDriver <44267643+4VRDriver@users.noreply.github.com> Date: Sun, 6 Sep 2020 16:55:54 +0200 Subject: [PATCH] Materials and light properties --- res/shaders/basic.fs | 33 ++++++++++++++++++++------------- src/Controller.cpp | 22 ++++++++++++++++------ 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/res/shaders/basic.fs b/res/shaders/basic.fs index 7427bde..2159004 100644 --- a/res/shaders/basic.fs +++ b/res/shaders/basic.fs @@ -7,7 +7,21 @@ struct Material { sampler2D u_texture_diffuse1; sampler2D u_texture_specular0; sampler2D u_texture_specular1; + vec3 ambient; + vec3 diffuse; + vec3 specular; + float shininess; }; +uniform Material material; + +struct Light { + vec3 position; + + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; +uniform Light light; in vec3 v_normal; in vec4 v_color; @@ -15,35 +29,28 @@ in vec2 v_texCoord; 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; + vec3 ambient = light.ambient * material.ambient; // Diffuse lighting vec3 normal = normalize(u_normalMatrix * v_normal); - vec3 lightDir = normalize(u_lightPosition - v_fragmentPosition); + vec3 lightDir = normalize(light.position - v_fragmentPosition); float diff = max(dot(normal, lightDir), 0.0f); - vec3 diffuse = diff * u_lightColor; + vec3 diffuse = light.diffuse * (diff * material.diffuse); // 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; + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); + vec3 specular = light.specular * (spec * material.specular); //f_color = v_color; //vec4 texColor1 = texture(material.u_texture_diffuse0, v_texCoord); @@ -51,5 +58,5 @@ void main() { //f_color = texColor1; - f_color = vec4((ambient + diffuse + specular) * u_objectColor, 1.0f); + f_color = vec4((ambient + diffuse + specular), 1.0f); } diff --git a/src/Controller.cpp b/src/Controller.cpp index 570e1b6..785ca47 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -49,12 +49,12 @@ 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_backpack, &shaderProgram); + //Entity backpack1(&model_cube, &shaderProgram); + Entity cube(&model_cube, &shaderProgram); Entity sphere(&model_sphere, &shaderProgram); Entity lightSource(&model_cube, &lightProgram); @@ -63,10 +63,20 @@ void Controller::run() { lightSource.translate(glm::vec3(-5.0f, 1.0f, 0.0f)); lightSource.scale(0.2f); + glm::vec3 lightColor = glm::vec3(1.0f, 1.0f, 1.0f); + glm::vec3 diffuseColor = lightColor * glm::vec3(1.0f); + glm::vec3 ambientColor = diffuseColor * glm::vec3(0.1f); + 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.setUniform("light.position", lightSource.getPosition()); + shaderProgram.setUniform("light.ambient", ambientColor); + shaderProgram.setUniform("light.diffuse", diffuseColor); + shaderProgram.setUniform("light.specular", glm::vec3(1.0f, 1.0f, 1.0f)); + + shaderProgram.setUniform("material.ambient", glm::vec3(1.0f, 0.5f, 0.31f)); + shaderProgram.setUniform("material.diffuse", glm::vec3(1.0f, 0.5f, 0.31f)); + shaderProgram.setUniform("material.specular", glm::vec3(0.5f, 0.5f, 0.5f)); + shaderProgram.setUniform("material.shininess", 32.0f); shaderProgram.unbind(); scene.push_back(lightSource);