lab4 and 5

This commit is contained in:
s473593 2023-11-25 13:34:52 +01:00
parent 023edecd35
commit d05ed9c720
5 changed files with 99 additions and 32 deletions

View File

@ -22,6 +22,7 @@ Core::Shader_Loader shaderLoader;
Core::RenderContext shipContext; Core::RenderContext shipContext;
Core::RenderContext sphereContext; Core::RenderContext sphereContext;
Core::RenderContext asteroidContext;
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);
@ -29,7 +30,7 @@ glm::vec3 cameraDir = glm::vec3(1.f, 0.f, 0.f);
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);
glm::vec3 spaceshipUp = glm::vec3(0.f, 1.f, 0.f); glm::vec3 spaceshipUp = glm::vec3(0.f, 1.f, 0.f);
GLuint VAO,VBO; GLuint VAO, VBO;
float aspectRatio = 1.f; float aspectRatio = 1.f;
@ -44,8 +45,8 @@ glm::vec2 posMouseReleased;
glm::mat4 createCameraMatrix() glm::mat4 createCameraMatrix()
{ {
glm::vec3 cameraSide = glm::normalize(glm::cross(cameraDir,glm::vec3(0.f,1.f,0.f))); glm::vec3 cameraSide = glm::normalize(glm::cross(cameraDir, glm::vec3(0.f, 1.f, 0.f)));
glm::vec3 cameraUp = glm::normalize(glm::cross(cameraSide,cameraDir)); glm::vec3 cameraUp = glm::normalize(glm::cross(cameraSide, cameraDir));
//glm::vec3 cameraUp = glm::vec3(0.f, 1.f, 0.f); //glm::vec3 cameraUp = glm::vec3(0.f, 1.f, 0.f);
glm::mat4 cameraRotrationMatrix = glm::mat4({ glm::mat4 cameraRotrationMatrix = glm::mat4({
cameraSide.x,cameraSide.y,cameraSide.z,0, cameraSide.x,cameraSide.y,cameraSide.z,0,
@ -73,7 +74,7 @@ glm::mat4 createCameraMatrix()
glm::mat4 createPerspectiveMatrix() glm::mat4 createPerspectiveMatrix()
{ {
glm::mat4 perspectiveMatrix; glm::mat4 perspectiveMatrix;
float n = 0.05; float n = 0.05;
float f = 20.; float f = 20.;
@ -82,12 +83,12 @@ glm::mat4 createPerspectiveMatrix()
perspectiveMatrix = glm::mat4({ perspectiveMatrix = glm::mat4({
a2,0.,0.,0., a2,0.,0.,0.,
0.,a1,0.,0., 0.,a1,0.,0.,
0.,0.,(f+n) / (n - f),2*f * n / (n - f), 0.,0.,(f + n) / (n - f),2 * f * n / (n - f),
0.,0.,-1.,0., 0.,0.,-1.,0.,
}); });
perspectiveMatrix=glm::transpose(perspectiveMatrix); perspectiveMatrix = glm::transpose(perspectiveMatrix);
return perspectiveMatrix; return perspectiveMatrix;
} }
@ -104,6 +105,7 @@ void drawObjectColor(Core::RenderContext& context, glm::mat4 modelMatrix, glm::v
void renderScene(GLFWwindow* window) void renderScene(GLFWwindow* window)
{ {
glClearColor(0.0f, 0.3f, 0.3f, 1.0f); glClearColor(0.0f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glm::mat4 transformation; glm::mat4 transformation;
float time = glfwGetTime(); float time = glfwGetTime();
@ -112,16 +114,48 @@ void renderScene(GLFWwindow* window)
deltaTime = glm::min(deltaTime, 0.1f); deltaTime = glm::min(deltaTime, 0.1f);
lastFrameTime = time; lastFrameTime = time;
glUseProgram(program); glUseProgram(program);
//zad6
for (int i = -10; i < 10; i++) {
glm::mat4 transformation = glm::translate(glm::vec3(i , 0.5, i ))
* glm::scale(glm::vec3(0.05));
drawObjectColor(sphereContext, transformation, glm::vec3(1, 1, 1));
}
glClear(GL_DEPTH_BUFFER_BIT);
for (int i = 0; i < 5; i++) {
float planetR = 3 + 2 * i;
float planetAngle = time / 3 + i;
glm::mat4 planetRotateM = glm::eulerAngleXYZ(planetAngle, 0.1f * i, 0.f);
//planet
transformation = planetRotateM * glm::translate(glm::vec3(0, planetR, 0))
* glm::scale(glm::vec3(0.5));
drawObjectColor(sphereContext, transformation, glm::vec3(0.3 + 0.1 * i, 0.3 - 0.05 * i, 0.2));
//satelite
transformation = planetRotateM * glm::translate(glm::vec3(0, planetR, 0))
* glm::eulerAngleX(time / 2) * glm::translate(glm::vec3(0, 1.f, 0))
* glm::scale(glm::vec3(0.2));
drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2));
}
//planet //planet
transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0)) //transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0))
* glm::scale(glm::vec3(0.4)); // * glm::scale(glm::vec3(0.4));
drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2)); //drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2));
//satelite ////satelite
transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0)) //transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0))
* glm::eulerAngleX(time / 2) * glm::translate(glm::vec3(0, 2.f, 0)) // * glm::eulerAngleX(time / 2) * glm::translate(glm::vec3(0, 2.f, 0))
* glm::scale(glm::vec3(0.2)); // * glm::scale(glm::vec3(0.2));
drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2)); //drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2));
for (int i = 0; i < 20; i++) {
transformation = glm::eulerAngleXYZ(2 * time + i, 0.f, 0.f) * glm::translate(glm::vec3(0, 10, 0))
* glm::scale(glm::vec3(0.0005));
drawObjectColor(asteroidContext, transformation, glm::vec3(1.0, 0, 0));
}
//satelite of satelite //satelite of satelite
/*transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0)) /*transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0))
* glm::eulerAngleX(time / 2) * glm::translate(glm::vec3(0, 2.f, 0)) * glm::eulerAngleX(time / 2) * glm::translate(glm::vec3(0, 2.f, 0))
@ -138,7 +172,7 @@ void renderScene(GLFWwindow* window)
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,
0.,0.,0.,1., 0.,0.,0.,1.,
}); });
drawObjectColor(shipContext, drawObjectColor(shipContext,
glm::translate(spaceshipPos) * speceshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()) * glm::scale(glm::vec3(0.5f)), glm::translate(spaceshipPos) * speceshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()) * glm::scale(glm::vec3(0.5f)),
@ -170,10 +204,10 @@ void cursor_position_callback(GLFWwindow* window, double xpos, double ypos)
{ {
if (moveCamWithMouse) { if (moveCamWithMouse) {
glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, spaceshipUp)); glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, spaceshipUp));
glm::vec3 diff = spaceshipSide * (xpos - lastMousePos.x) - spaceshipUp * (ypos - lastMousePos.y); glm::vec3 diff = spaceshipSide * (xpos - lastMousePos.x) - spaceshipUp * (ypos - lastMousePos.y);
spaceshipDir = glm::normalize(spaceshipDir - diff / 1000.f); spaceshipDir = glm::normalize(spaceshipDir - diff / 1000.f);
lastMousePos = glm::vec2(xpos, ypos); lastMousePos = glm::vec2(xpos, ypos);
} }
} }
@ -201,8 +235,9 @@ void init(GLFWwindow* window)
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
program = shaderLoader.CreateProgram("shaders/shader_4_1.vert", "shaders/shader_4_1.frag"); program = shaderLoader.CreateProgram("shaders/shader_4_1.vert", "shaders/shader_4_1.frag");
loadModelToContext("./models/sphere.obj",sphereContext); loadModelToContext("./models/sphere.obj", sphereContext);
loadModelToContext("./models/spaceship.obj", shipContext); loadModelToContext("./models/spaceship.obj", shipContext);
loadModelToContext("./models/10464_Asteroid_v1_Iterations-2.obj", asteroidContext);
} }
void shutdown(GLFWwindow* window) void shutdown(GLFWwindow* window)

View File

@ -1,18 +1,25 @@
#version 430 core #version 430 core
uniform vec3 color; uniform vec3 color;
uniform vec3 lightDir; uniform vec3 lightPos;
uniform vec3 lightColor; uniform vec3 lightColor;
uniform vec3 cameraPos; uniform vec3 cameraPos;
uniform float time; uniform float time;
uniform float lightExp;
in vec3 vertexNormalOut; in vec3 vertexNormalOut;
in vec3 vertexPosOut; in vec3 vertexPosOut;
out vec4 outColor; out vec4 outColor;
void main() void main()
{ {
vec3 lightDir = normalize(vertexPosOut - lightPos);
float lightDistance = length(vertexPosOut - lightPos);
vec3 newLightColor = lightColor / pow(lightDistance, 2);
vec3 normalizedVertexNormal = normalize(vertexNormalOut); vec3 normalizedVertexNormal = normalize(vertexNormalOut);
float intensity = dot(normalizedVertexNormal, -lightDir); float intensity = dot(normalizedVertexNormal, -lightDir);
intensity = max(intensity, 0.0); intensity = max(intensity, 0.0);
@ -24,5 +31,6 @@ 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(lightColor * (color * diffuse + specular ), 1.0); outColor = vec4(newLightColor * (color * diffuse + specular ), 1.0);
outColor = 1 - exp(-outColor * lightExp);
} }

View File

@ -1,12 +1,23 @@
#version 430 core #version 430 core
uniform vec3 color; uniform vec3 color;
uniform vec3 lightPos;
uniform vec3 lightColor;
uniform vec3 cameraPos;
float M_PI = 3.1415926535897932384626433832795;
in vec3 interpNormal; in vec3 interpNormal;
in vec3 vertexNormalOut;
out vec4 out_color; in vec3 vertexPosOut;
out vec4 outColor;
void main() void main()
{ {
out_color = vec4(color, 1.0); vec3 normalizedVertexNormal = normalize(vertexNormalOut);
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);
} }

View File

@ -4,12 +4,16 @@ layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec3 vertexNormal; layout(location = 1) in vec3 vertexNormal;
layout(location = 2) in vec2 vertexTexCoord; layout(location = 2) in vec2 vertexTexCoord;
uniform mat4 transformation; uniform mat4 transformation;
uniform mat4 modelMat;
out vec3 vertexNormalOut;
out vec3 vertexPosOut;
void main() void main()
{ {
gl_Position = transformation * vec4(vertexPosition, 1.0); gl_Position = transformation * vec4(vertexPosition, 1.0);
vec4 worldNormal = modelMat * vec4(vertexNormal, 0.0);
vertexNormalOut = worldNormal.xyz;
vertexPosOut = (modelMat * vec4(vertexPosition, 1.0)).xyz;
} }

View File

@ -18,6 +18,7 @@
GLuint program; GLuint program;
GLuint programSun;
Core::Shader_Loader shaderLoader; Core::Shader_Loader shaderLoader;
@ -29,6 +30,7 @@ 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); glm::vec3 lightColor = glm::vec3(1.f, 1.f, 1.f);
float lightExp = 100;
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);
@ -87,15 +89,17 @@ glm::mat4 createPerspectiveMatrix()
return perspectiveMatrix; return perspectiveMatrix;
} }
void drawObjectColor(Core::RenderContext& context, glm::mat4 modelMatrix, glm::vec3 color) { void drawObjectColor(GLuint program, Core::RenderContext& context, glm::mat4 modelMatrix, glm::vec3 color) {
glUseProgram(program); glUseProgram(program);
glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix();
glm::mat4 transformation = viewProjectionMatrix * modelMatrix; glm::mat4 transformation = viewProjectionMatrix * modelMatrix;
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);
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, "lightColor"), lightColor.x, lightColor.y, lightColor.z); glUniform3f(glGetUniformLocation(program, "lightColor"), lightColor.x, lightColor.y, lightColor.z);
glUniform1f(glGetUniformLocation(program, "lightExp"), lightExp);
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);
@ -114,11 +118,11 @@ void renderScene(GLFWwindow* window)
drawObjectColor(sphereContext, glm::mat4(), glm::vec3(1.0, 1.0, 0.3)); drawObjectColor(programSun, sphereContext, glm::mat4(), glm::vec3(1.0, 1.0, 0.3));
drawObjectColor(sphereContext, glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(4.f, 0, 0)) * glm::scale(glm::vec3(0.3f)), glm::vec3(0.2, 0.7, 0.3)); drawObjectColor(program, sphereContext, glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(4.f, 0, 0)) * glm::scale(glm::vec3(0.3f)), glm::vec3(0.2, 0.7, 0.3));
drawObjectColor(sphereContext, drawObjectColor(program, sphereContext,
glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(4.f, 0, 0)) * glm::eulerAngleY(time) * glm::translate(glm::vec3(1.f, 0, 0)) * glm::scale(glm::vec3(0.1f)), glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(4.f, 0, 0)) * glm::eulerAngleY(time) * glm::translate(glm::vec3(1.f, 0, 0)) * glm::scale(glm::vec3(0.1f)),
glm::vec3(0.5, 0.5, 0.5)); glm::vec3(0.5, 0.5, 0.5));
@ -136,7 +140,7 @@ void renderScene(GLFWwindow* window)
// glm::translate(cameraPos + 1.5 * cameraDir + cameraUp * -0.5f) * inveseCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()), // glm::translate(cameraPos + 1.5 * cameraDir + cameraUp * -0.5f) * inveseCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()),
// glm::vec3(0.3, 0.3, 0.5) // glm::vec3(0.3, 0.3, 0.5)
// ); // );
drawObjectColor(shipContext, drawObjectColor(program, shipContext,
glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()) * glm::scale(glm::vec3(0.2f)), glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * 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)
); );
@ -168,6 +172,7 @@ void init(GLFWwindow* window)
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
program = shaderLoader.CreateProgram("shaders/shader_5_1.vert", "shaders/shader_5_1.frag"); program = shaderLoader.CreateProgram("shaders/shader_5_1.vert", "shaders/shader_5_1.frag");
programSun = shaderLoader.CreateProgram("shaders/shader_5_sun.vert", "shaders/shader_5_sun.frag");
loadModelToContext("./models/sphere.obj", sphereContext); loadModelToContext("./models/sphere.obj", sphereContext);
loadModelToContext("./models/spaceship.obj", shipContext); loadModelToContext("./models/spaceship.obj", shipContext);
@ -215,6 +220,10 @@ void processInput(GLFWwindow* window)
//cameraDir = glm::normalize(-cameraPos); //cameraDir = glm::normalize(-cameraPos);
if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS)
lightExp -= 1;
if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS)
lightExp += 1;
} }
// funkcja jest glowna petla // funkcja jest glowna petla