diff --git a/cw 4/src/ex_4_1.hpp b/cw 4/src/ex_4_1.hpp index 8f4dc79..9879f98 100644 --- a/cw 4/src/ex_4_1.hpp +++ b/cw 4/src/ex_4_1.hpp @@ -22,6 +22,7 @@ Core::Shader_Loader shaderLoader; Core::RenderContext shipContext; Core::RenderContext sphereContext; +Core::RenderContext asteroidContext; glm::vec3 cameraPos = glm::vec3(-4.f, 0, 0); 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 spaceshipDir = glm::vec3(1.f, 0.f, 0.f); glm::vec3 spaceshipUp = glm::vec3(0.f, 1.f, 0.f); -GLuint VAO,VBO; +GLuint VAO, VBO; float aspectRatio = 1.f; @@ -44,8 +45,8 @@ glm::vec2 posMouseReleased; glm::mat4 createCameraMatrix() { - 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 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::vec3(0.f, 1.f, 0.f); glm::mat4 cameraRotrationMatrix = glm::mat4({ cameraSide.x,cameraSide.y,cameraSide.z,0, @@ -73,7 +74,7 @@ glm::mat4 createCameraMatrix() glm::mat4 createPerspectiveMatrix() { - + glm::mat4 perspectiveMatrix; float n = 0.05; float f = 20.; @@ -82,12 +83,12 @@ glm::mat4 createPerspectiveMatrix() perspectiveMatrix = glm::mat4({ a2,0.,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., }); - - perspectiveMatrix=glm::transpose(perspectiveMatrix); + + perspectiveMatrix = glm::transpose(perspectiveMatrix); return perspectiveMatrix; } @@ -104,6 +105,7 @@ void drawObjectColor(Core::RenderContext& context, glm::mat4 modelMatrix, glm::v void renderScene(GLFWwindow* window) { glClearColor(0.0f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glm::mat4 transformation; float time = glfwGetTime(); @@ -112,16 +114,48 @@ void renderScene(GLFWwindow* window) deltaTime = glm::min(deltaTime, 0.1f); lastFrameTime = time; + 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 - transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0)) - * glm::scale(glm::vec3(0.4)); - drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2)); - //satelite - 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::scale(glm::vec3(0.2)); - drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2)); + //transformation = glm::eulerAngleXYZ(time / 3, 0.f, 0.f) * glm::translate(glm::vec3(0, 4, 0)) + // * glm::scale(glm::vec3(0.4)); + //drawObjectColor(sphereContext, transformation, glm::vec3(0.3, 0.3, 0.2)); + ////satelite + //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::scale(glm::vec3(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 /*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)) @@ -138,7 +172,7 @@ void renderScene(GLFWwindow* window) spaceshipUp.x,spaceshipUp.y,spaceshipUp.z ,0, -spaceshipDir.x,-spaceshipDir.y,-spaceshipDir.z,0, 0.,0.,0.,1., - }); + }); drawObjectColor(shipContext, glm::translate(spaceshipPos) * speceshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi()) * glm::scale(glm::vec3(0.5f)), @@ -170,10 +204,10 @@ void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) { if (moveCamWithMouse) { glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, spaceshipUp)); - + glm::vec3 diff = spaceshipSide * (xpos - lastMousePos.x) - spaceshipUp * (ypos - lastMousePos.y); spaceshipDir = glm::normalize(spaceshipDir - diff / 1000.f); - + lastMousePos = glm::vec2(xpos, ypos); } } @@ -201,8 +235,9 @@ void init(GLFWwindow* window) glEnable(GL_DEPTH_TEST); 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/10464_Asteroid_v1_Iterations-2.obj", asteroidContext); } void shutdown(GLFWwindow* window) diff --git a/cw 5/shaders/shader_5_1.frag b/cw 5/shaders/shader_5_1.frag index ad2bb25..2d8928b 100644 --- a/cw 5/shaders/shader_5_1.frag +++ b/cw 5/shaders/shader_5_1.frag @@ -1,18 +1,25 @@ #version 430 core uniform vec3 color; -uniform vec3 lightDir; +uniform vec3 lightPos; uniform vec3 lightColor; uniform vec3 cameraPos; uniform float time; +uniform float lightExp; in vec3 vertexNormalOut; in vec3 vertexPosOut; out vec4 outColor; + void main() { + 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); @@ -24,5 +31,6 @@ void main() float specular = pow(max(dot(viewDir, reflectDir), 0.0), glossPow); float diffuse = intensity; - outColor = vec4(lightColor * (color * diffuse + specular ), 1.0); + outColor = vec4(newLightColor * (color * diffuse + specular ), 1.0); + outColor = 1 - exp(-outColor * lightExp); } diff --git a/cw 5/shaders/shader_5_sun.frag b/cw 5/shaders/shader_5_sun.frag index 98624d8..5374a8e 100644 --- a/cw 5/shaders/shader_5_sun.frag +++ b/cw 5/shaders/shader_5_sun.frag @@ -1,12 +1,23 @@ #version 430 core uniform vec3 color; +uniform vec3 lightPos; +uniform vec3 lightColor; +uniform vec3 cameraPos; + +float M_PI = 3.1415926535897932384626433832795; in vec3 interpNormal; - -out vec4 out_color; +in vec3 vertexNormalOut; +in vec3 vertexPosOut; +out vec4 outColor; 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); } diff --git a/cw 5/shaders/shader_5_sun.vert b/cw 5/shaders/shader_5_sun.vert index 6eb77b0..94ba36b 100644 --- a/cw 5/shaders/shader_5_sun.vert +++ b/cw 5/shaders/shader_5_sun.vert @@ -4,12 +4,16 @@ layout(location = 0) in vec3 vertexPosition; layout(location = 1) in vec3 vertexNormal; layout(location = 2) in vec2 vertexTexCoord; - uniform mat4 transformation; +uniform mat4 modelMat; +out vec3 vertexNormalOut; +out vec3 vertexPosOut; void main() { gl_Position = transformation * vec4(vertexPosition, 1.0); - + vec4 worldNormal = modelMat * vec4(vertexNormal, 0.0); + vertexNormalOut = worldNormal.xyz; + vertexPosOut = (modelMat * vec4(vertexPosition, 1.0)).xyz; } diff --git a/cw 5/src/ex_5_1.hpp b/cw 5/src/ex_5_1.hpp index a622d36..fa671db 100644 --- a/cw 5/src/ex_5_1.hpp +++ b/cw 5/src/ex_5_1.hpp @@ -18,6 +18,7 @@ GLuint program; +GLuint programSun; 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 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 spaceshipPos = glm::vec3(-4.f, 0, 0); glm::vec3 spaceshipDir = glm::vec3(1.f, 0.f, 0.f); @@ -87,15 +89,17 @@ glm::mat4 createPerspectiveMatrix() 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); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); glm::mat4 transformation = viewProjectionMatrix * modelMatrix; 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); - 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); + glUniform1f(glGetUniformLocation(program, "lightExp"), lightExp); glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); //TEST 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::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()), // glm::vec3(0.3, 0.3, 0.5) // ); - drawObjectColor(shipContext, + drawObjectColor(program, shipContext, glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi()) * glm::scale(glm::vec3(0.2f)), glm::vec3(0.3, 0.3, 0.5) ); @@ -168,6 +172,7 @@ void init(GLFWwindow* window) glEnable(GL_DEPTH_TEST); 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/spaceship.obj", shipContext); @@ -215,6 +220,10 @@ void processInput(GLFWwindow* window) //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