diff --git a/cw 5/shaders/shader_5_1.frag b/cw 5/shaders/shader_5_1.frag index 2d8928b..3781206 100644 --- a/cw 5/shaders/shader_5_1.frag +++ b/cw 5/shaders/shader_5_1.frag @@ -1,26 +1,30 @@ #version 430 core uniform vec3 color; -uniform vec3 lightPos; -uniform vec3 lightColor; -uniform vec3 cameraPos; +uniform vec3 sunPos; +uniform vec3 sunColor; +uniform float sunLightExp; +uniform vec3 cameraPos; uniform float time; -uniform float lightExp; + +uniform vec3 reflectorPos; +uniform vec3 reflectorDir; +uniform vec3 reflectorColor; +uniform float reflectorAngle; +uniform float reflectorLightExp; + +vec3 normalizedVertexNormal; in vec3 vertexNormalOut; in vec3 vertexPosOut; out vec4 outColor; - -void main() -{ +vec4 calcPointLight(vec3 fragColor, vec3 lightPos, vec3 lightColor, float lightExp) { vec3 lightDir = normalize(vertexPosOut - lightPos); - float lightDistance = length(vertexPosOut - lightPos); vec3 newLightColor = lightColor / pow(lightDistance, 2); - - vec3 normalizedVertexNormal = normalize(vertexNormalOut); + float intensity = dot(normalizedVertexNormal, -lightDir); intensity = max(intensity, 0.0); @@ -31,6 +35,37 @@ void main() float specular = pow(max(dot(viewDir, reflectDir), 0.0), glossPow); float diffuse = intensity; - outColor = vec4(newLightColor * (color * diffuse + specular ), 1.0); - outColor = 1 - exp(-outColor * lightExp); + vec3 resultColor = newLightColor * (fragColor * diffuse + specular ); + return vec4(1 - exp(-resultColor * lightExp), 1.0); +} + +vec4 calcSpotLight(vec3 fragColor, vec3 lightPos, vec3 lightColor, vec3 lightDir, float lightExp) { + vec3 reflectorLightDir = normalize(vertexPosOut - reflectorPos); + float angleCos = dot(reflectorLightDir, reflectorDir); + float reflectorOutAngle = reflectorAngle + radians(10); + float epsilon = cos(reflectorAngle) - cos(reflectorOutAngle); + vec4 res = vec4(0, 0, 0, 1); + if (angleCos > cos(reflectorOutAngle)) { + float intensity = clamp((angleCos - cos(reflectorOutAngle)) / epsilon, 0.0, 1.0); + res = calcPointLight(color, reflectorPos, reflectorColor, reflectorLightExp * intensity); + } + return res; +} + + + +void main() +{ + normalizedVertexNormal = normalize(vertexNormalOut); + + outColor = calcPointLight(color, sunPos, sunColor, sunLightExp); + + vec3 reflectorLightDir = normalize(vertexPosOut - reflectorPos); + float angleCos = dot(reflectorLightDir, reflectorDir); + float reflectorOutAngle = reflectorAngle + radians(10); + float epsilon = cos(reflectorAngle) - cos(reflectorOutAngle); + if (angleCos > cos(reflectorOutAngle)) { + float intensity = clamp((angleCos - cos(reflectorOutAngle)) / epsilon, 0.0, 1.0); + outColor += calcSpotLight(color, reflectorPos, reflectorColor, reflectorLightDir, reflectorLightExp * intensity); + } } diff --git a/cw 5/shaders/shader_5_sun.frag b/cw 5/shaders/shader_5_sun.frag index 5374a8e..0da7884 100644 --- a/cw 5/shaders/shader_5_sun.frag +++ b/cw 5/shaders/shader_5_sun.frag @@ -18,6 +18,7 @@ void main() vec3 viewDir = normalize(cameraPos - vertexPosOut); float angle = dot(viewDir, normalizedVertexNormal); - //outColor = vec4(color * (angle / M_PI), 1.0); - outColor = vec4(mix(color, vec3(1), angle), 1.0); +// outColor = vec4(color * angle, 1.0); + vec3 red = vec3(1, 0, 0); + outColor = vec4(mix(red, color, angle), 1.0); } diff --git a/cw 5/src/ex_5_1.hpp b/cw 5/src/ex_5_1.hpp index fa671db..5d1def7 100644 --- a/cw 5/src/ex_5_1.hpp +++ b/cw 5/src/ex_5_1.hpp @@ -29,8 +29,13 @@ Core::RenderContext sphereContext; glm::vec3 cameraPos = glm::vec3(-4.f, 0, 0); glm::vec3 cameraDir = glm::vec3(1.f, 0.f, 0.f); glm::vec3 lightDir = glm::normalize(glm::vec3(1.f, 1.f, 1.f)); -glm::vec3 lightColor = glm::vec3(1.f, 1.f, 1.f); -float lightExp = 100; + +glm::vec3 sunLightColor = glm::vec3(1.f, 1.f, 1.f); +float sunLightExp = 100; + +glm::vec3 reflectorColor = glm::vec3(0.3f, 0.f, 0.f); +float reflectorAngle = glm::radians(25.f); +float reflectorLightExp = 5; glm::vec3 spaceshipPos = glm::vec3(-4.f, 0, 0); glm::vec3 spaceshipDir = glm::vec3(1.f, 0.f, 0.f); @@ -96,10 +101,20 @@ void drawObjectColor(GLuint program, Core::RenderContext& context, glm::mat4 mod glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); glUniformMatrix4fv(glGetUniformLocation(program, "modelMat"), 1, GL_FALSE, (float*)&modelMatrix); glUniform3f(glGetUniformLocation(program, "color"), color.x, color.y, color.z); + //sun //glUniform3f(glGetUniformLocation(program, "lightDir"), lightDir.x, lightDir.y, lightDir.z); - glUniform3f(glGetUniformLocation(program, "lightPos"), 0.f, 0.f, 0.f); - glUniform3f(glGetUniformLocation(program, "lightColor"), lightColor.x, lightColor.y, lightColor.z); - glUniform1f(glGetUniformLocation(program, "lightExp"), lightExp); + glUniform3f(glGetUniformLocation(program, "sunPos"), 0.f, 0.f, 0.f); + glUniform3f(glGetUniformLocation(program, "sunColor"), sunLightColor.x, sunLightColor.y, sunLightColor.z); + glUniform1f(glGetUniformLocation(program, "sunLightExp"), sunLightExp); + //spaceship reflector + glm::vec3 reflectorPos = spaceshipPos + 0.037f * spaceshipDir; + glUniform3f(glGetUniformLocation(program, "reflectorPos"), reflectorPos.x, reflectorPos.y, reflectorPos.z); + glUniform3f(glGetUniformLocation(program, "reflectorDir"), spaceshipDir.x, spaceshipDir.y, spaceshipDir.z); + glUniform1f(glGetUniformLocation(program, "reflectorAngle"), reflectorAngle); + glUniform3f(glGetUniformLocation(program, "reflectorColor"), + reflectorColor.x, reflectorColor.y, reflectorColor.z); + glUniform1f(glGetUniformLocation(program, "reflectorLightExp"), reflectorLightExp); + glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); //TEST glUniform1f(glGetUniformLocation(program, "time"), lastTime); @@ -116,7 +131,7 @@ void renderScene(GLFWwindow* window) float time = glfwGetTime(); updateDeltaTime(time); - + time = 0; drawObjectColor(programSun, sphereContext, glm::mat4(), glm::vec3(1.0, 1.0, 0.3)); @@ -128,7 +143,7 @@ void renderScene(GLFWwindow* window) glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f))); glm::vec3 spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir)); - glm::mat4 specshipCameraRotrationMatrix = glm::mat4({ + glm::mat4 spaceshipCameraRotrationMatrix = glm::mat4({ spaceshipSide.x,spaceshipSide.y,spaceshipSide.z,0, spaceshipUp.x,spaceshipUp.y,spaceshipUp.z ,0, -spaceshipDir.x,-spaceshipDir.y,-spaceshipDir.z,0, @@ -141,11 +156,10 @@ void renderScene(GLFWwindow* window) // glm::vec3(0.3, 0.3, 0.5) // ); drawObjectColor(program, shipContext, - glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi()) * glm::scale(glm::vec3(0.2f)), + glm::translate(spaceshipPos) * spaceshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi()) * glm::scale(glm::vec3(0.2f)), glm::vec3(0.3, 0.3, 0.5) ); - glfwSwapBuffers(window); } void framebuffer_size_callback(GLFWwindow* window, int width, int height) @@ -221,9 +235,14 @@ void processInput(GLFWwindow* window) //cameraDir = glm::normalize(-cameraPos); if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS) - lightExp -= 1; + sunLightExp = glm::max(0.f, sunLightExp - 0.01f); if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS) - lightExp += 1; + sunLightExp += 0.01f; + + if (glfwGetKey(window, GLFW_KEY_3) == GLFW_PRESS) + reflectorLightExp = glm::max(0.f, reflectorLightExp - 0.01f); + if (glfwGetKey(window, GLFW_KEY_4) == GLFW_PRESS) + reflectorLightExp += 0.01f; } // funkcja jest glowna petla