lab 5 spaceship light
This commit is contained in:
parent
d05ed9c720
commit
fe0c001753
@ -1,26 +1,30 @@
|
|||||||
#version 430 core
|
#version 430 core
|
||||||
|
|
||||||
uniform vec3 color;
|
uniform vec3 color;
|
||||||
uniform vec3 lightPos;
|
uniform vec3 sunPos;
|
||||||
uniform vec3 lightColor;
|
uniform vec3 sunColor;
|
||||||
uniform vec3 cameraPos;
|
uniform float sunLightExp;
|
||||||
|
|
||||||
|
uniform vec3 cameraPos;
|
||||||
uniform float time;
|
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 vertexNormalOut;
|
||||||
in vec3 vertexPosOut;
|
in vec3 vertexPosOut;
|
||||||
out vec4 outColor;
|
out vec4 outColor;
|
||||||
|
|
||||||
|
vec4 calcPointLight(vec3 fragColor, vec3 lightPos, vec3 lightColor, float lightExp) {
|
||||||
void main()
|
|
||||||
{
|
|
||||||
vec3 lightDir = normalize(vertexPosOut - lightPos);
|
vec3 lightDir = normalize(vertexPosOut - lightPos);
|
||||||
|
|
||||||
float lightDistance = length(vertexPosOut - lightPos);
|
float lightDistance = length(vertexPosOut - lightPos);
|
||||||
vec3 newLightColor = lightColor / pow(lightDistance, 2);
|
vec3 newLightColor = lightColor / pow(lightDistance, 2);
|
||||||
|
|
||||||
vec3 normalizedVertexNormal = normalize(vertexNormalOut);
|
|
||||||
float intensity = dot(normalizedVertexNormal, -lightDir);
|
float intensity = dot(normalizedVertexNormal, -lightDir);
|
||||||
intensity = max(intensity, 0.0);
|
intensity = max(intensity, 0.0);
|
||||||
|
|
||||||
@ -31,6 +35,37 @@ void main()
|
|||||||
float specular = pow(max(dot(viewDir, reflectDir), 0.0), glossPow);
|
float specular = pow(max(dot(viewDir, reflectDir), 0.0), glossPow);
|
||||||
|
|
||||||
float diffuse = intensity;
|
float diffuse = intensity;
|
||||||
outColor = vec4(newLightColor * (color * diffuse + specular ), 1.0);
|
vec3 resultColor = newLightColor * (fragColor * diffuse + specular );
|
||||||
outColor = 1 - exp(-outColor * lightExp);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ void main()
|
|||||||
vec3 viewDir = normalize(cameraPos - vertexPosOut);
|
vec3 viewDir = normalize(cameraPos - vertexPosOut);
|
||||||
float angle = dot(viewDir, normalizedVertexNormal);
|
float angle = dot(viewDir, normalizedVertexNormal);
|
||||||
|
|
||||||
//outColor = vec4(color * (angle / M_PI), 1.0);
|
// outColor = vec4(color * angle, 1.0);
|
||||||
outColor = vec4(mix(color, vec3(1), angle), 1.0);
|
vec3 red = vec3(1, 0, 0);
|
||||||
|
outColor = vec4(mix(red, color, angle), 1.0);
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,13 @@ Core::RenderContext sphereContext;
|
|||||||
glm::vec3 cameraPos = glm::vec3(-4.f, 0, 0);
|
glm::vec3 cameraPos = glm::vec3(-4.f, 0, 0);
|
||||||
glm::vec3 cameraDir = glm::vec3(1.f, 0.f, 0.f);
|
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 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 spaceshipPos = glm::vec3(-4.f, 0, 0);
|
||||||
glm::vec3 spaceshipDir = glm::vec3(1.f, 0.f, 0.f);
|
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, "transformation"), 1, GL_FALSE, (float*)&transformation);
|
||||||
glUniformMatrix4fv(glGetUniformLocation(program, "modelMat"), 1, GL_FALSE, (float*)&modelMatrix);
|
glUniformMatrix4fv(glGetUniformLocation(program, "modelMat"), 1, GL_FALSE, (float*)&modelMatrix);
|
||||||
glUniform3f(glGetUniformLocation(program, "color"), color.x, color.y, color.z);
|
glUniform3f(glGetUniformLocation(program, "color"), color.x, color.y, color.z);
|
||||||
|
//sun
|
||||||
//glUniform3f(glGetUniformLocation(program, "lightDir"), lightDir.x, lightDir.y, lightDir.z);
|
//glUniform3f(glGetUniformLocation(program, "lightDir"), lightDir.x, lightDir.y, lightDir.z);
|
||||||
glUniform3f(glGetUniformLocation(program, "lightPos"), 0.f, 0.f, 0.f);
|
glUniform3f(glGetUniformLocation(program, "sunPos"), 0.f, 0.f, 0.f);
|
||||||
glUniform3f(glGetUniformLocation(program, "lightColor"), lightColor.x, lightColor.y, lightColor.z);
|
glUniform3f(glGetUniformLocation(program, "sunColor"), sunLightColor.x, sunLightColor.y, sunLightColor.z);
|
||||||
glUniform1f(glGetUniformLocation(program, "lightExp"), lightExp);
|
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);
|
glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z);
|
||||||
//TEST
|
//TEST
|
||||||
glUniform1f(glGetUniformLocation(program, "time"), lastTime);
|
glUniform1f(glGetUniformLocation(program, "time"), lastTime);
|
||||||
@ -116,7 +131,7 @@ void renderScene(GLFWwindow* window)
|
|||||||
float time = glfwGetTime();
|
float time = glfwGetTime();
|
||||||
updateDeltaTime(time);
|
updateDeltaTime(time);
|
||||||
|
|
||||||
|
time = 0;
|
||||||
|
|
||||||
drawObjectColor(programSun, sphereContext, glm::mat4(), glm::vec3(1.0, 1.0, 0.3));
|
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 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f)));
|
||||||
glm::vec3 spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir));
|
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,
|
spaceshipSide.x,spaceshipSide.y,spaceshipSide.z,0,
|
||||||
spaceshipUp.x,spaceshipUp.y,spaceshipUp.z ,0,
|
spaceshipUp.x,spaceshipUp.y,spaceshipUp.z ,0,
|
||||||
-spaceshipDir.x,-spaceshipDir.y,-spaceshipDir.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)
|
// glm::vec3(0.3, 0.3, 0.5)
|
||||||
// );
|
// );
|
||||||
drawObjectColor(program, shipContext,
|
drawObjectColor(program, shipContext,
|
||||||
glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()) * glm::scale(glm::vec3(0.2f)),
|
glm::translate(spaceshipPos) * spaceshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()) * glm::scale(glm::vec3(0.2f)),
|
||||||
glm::vec3(0.3, 0.3, 0.5)
|
glm::vec3(0.3, 0.3, 0.5)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
}
|
}
|
||||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
@ -221,9 +235,14 @@ void processInput(GLFWwindow* window)
|
|||||||
//cameraDir = glm::normalize(-cameraPos);
|
//cameraDir = glm::normalize(-cameraPos);
|
||||||
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS)
|
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)
|
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
|
// funkcja jest glowna petla
|
||||||
|
Loading…
Reference in New Issue
Block a user