From b7731e7faff1340b4a6d7c19ef0aa645362a15fd Mon Sep 17 00:00:00 2001 From: xkamikoo <58092037+xkamikoo@users.noreply.github.com> Date: Fri, 29 Jan 2021 02:03:00 +0100 Subject: [PATCH] Add bloom --- Skybox.h | 0 grk-project.vcxproj | 16 +- grk-project.vcxproj.filters | 24 +-- shaders/shader_4_1.frag | 21 -- shaders/shader_4_1.vert | 17 -- shaders/shader_4_sun.frag | 21 -- shaders/shader_4_tex.frag | 53 ----- shaders/shader_4_tex.vert | 20 -- .../{shader_bloom3.frag => shader_bloom.frag} | 8 +- .../{shader_bloom2.vert => shader_bloom.vert} | 0 shaders/shader_bloom1.vert | 19 -- .../{shader_bloom2.frag => shader_blur.frag} | 0 .../{shader_bloom3.vert => shader_blur.vert} | 0 shaders/shader_skybox.frag | 4 +- shaders/shader_skybox.vert | 2 +- .../{shader_bloom1.frag => shader_sun.frag} | 2 +- .../{shader_4_sun.vert => shader_sun.vert} | 0 src/main 2.2.cpp | 172 ---------------- src/main 3.cpp | 184 ----------------- src/main 4.cpp | 189 ------------------ src/main.cpp | 130 ++++-------- 21 files changed, 59 insertions(+), 823 deletions(-) delete mode 100644 Skybox.h delete mode 100644 shaders/shader_4_1.frag delete mode 100644 shaders/shader_4_1.vert delete mode 100644 shaders/shader_4_sun.frag delete mode 100644 shaders/shader_4_tex.frag delete mode 100644 shaders/shader_4_tex.vert rename shaders/{shader_bloom3.frag => shader_bloom.frag} (62%) rename shaders/{shader_bloom2.vert => shader_bloom.vert} (100%) delete mode 100644 shaders/shader_bloom1.vert rename shaders/{shader_bloom2.frag => shader_blur.frag} (100%) rename shaders/{shader_bloom3.vert => shader_blur.vert} (100%) rename shaders/{shader_bloom1.frag => shader_sun.frag} (97%) rename shaders/{shader_4_sun.vert => shader_sun.vert} (100%) delete mode 100644 src/main 2.2.cpp delete mode 100644 src/main 3.cpp delete mode 100644 src/main 4.cpp diff --git a/Skybox.h b/Skybox.h deleted file mode 100644 index e69de29..0000000 diff --git a/grk-project.vcxproj b/grk-project.vcxproj index 80a901c..3cabe13 100644 --- a/grk-project.vcxproj +++ b/grk-project.vcxproj @@ -11,20 +11,16 @@ - - - - - - - - - - + + + + + + diff --git a/grk-project.vcxproj.filters b/grk-project.vcxproj.filters index fbdcdfc..46e4667 100644 --- a/grk-project.vcxproj.filters +++ b/grk-project.vcxproj.filters @@ -30,40 +30,28 @@ Shader Files - - Shader Files - - - Shader Files - - - Shader Files - - - Shader Files - Shader Files Shader Files - + Shader Files - + Shader Files - + Shader Files - + Shader Files - + Shader Files - + Shader Files diff --git a/shaders/shader_4_1.frag b/shaders/shader_4_1.frag deleted file mode 100644 index 6837b8e..0000000 --- a/shaders/shader_4_1.frag +++ /dev/null @@ -1,21 +0,0 @@ -#version 430 core - -uniform vec3 objectColor; -//uniform vec3 lightDir; -uniform vec3 lightPos; -uniform vec3 cameraPos; - -in vec3 interpNormal; -in vec3 fragPos; - -void main() -{ - vec3 lightDir = normalize(lightPos-fragPos); - vec3 V = normalize(cameraPos-fragPos); - vec3 normal = normalize(interpNormal); - vec3 R = reflect(-normalize(lightDir),normal); - - float specular = pow(max(0,dot(R,V)),10); - float diffuse = max(0,dot(normal,normalize(lightDir))); - gl_FragColor = vec4(mix(objectColor,objectColor*diffuse+vec3(1)*specular,0.9), 1.0); -} diff --git a/shaders/shader_4_1.vert b/shaders/shader_4_1.vert deleted file mode 100644 index 29178b2..0000000 --- a/shaders/shader_4_1.vert +++ /dev/null @@ -1,17 +0,0 @@ -#version 430 core - -layout(location = 0) in vec3 vertexPosition; -layout(location = 2) in vec2 vertexTexCoord; -layout(location = 1) in vec3 vertexNormal; - -uniform mat4 transformation; -uniform mat4 modelMatrix; -out vec3 interpNormal; -out vec3 fragPos; - -void main() -{ - gl_Position = transformation * vec4(vertexPosition, 1.0); - interpNormal = (modelMatrix*vec4(vertexNormal,0)).xyz; - fragPos = (modelMatrix*vec4(vertexPosition,1)).xyz; -} diff --git a/shaders/shader_4_sun.frag b/shaders/shader_4_sun.frag deleted file mode 100644 index af2cf33..0000000 --- a/shaders/shader_4_sun.frag +++ /dev/null @@ -1,21 +0,0 @@ -#version 430 core - -uniform vec3 objectColor; -//uniform vec3 lightDir; -uniform vec3 lightPos; -uniform vec3 cameraPos; -uniform sampler2D colorTexture; -uniform vec3 colorTex; -in vec3 interpNormal; -in vec3 fragPos; -in vec2 vTexCoord; - -void main() -{ - vec3 normal = normalize(interpNormal); - vec3 V = normalize(cameraPos-fragPos); - float coef = pow(max(0,dot(normal,V)),2); - vec4 textureColor = texture2D(colorTexture, -vTexCoord); - vec3 texture = vec3(textureColor.x, textureColor.y, textureColor.z) * colorTex; - gl_FragColor = vec4(texture + texture * coef, 1.0); -} diff --git a/shaders/shader_4_tex.frag b/shaders/shader_4_tex.frag deleted file mode 100644 index 10105dc..0000000 --- a/shaders/shader_4_tex.frag +++ /dev/null @@ -1,53 +0,0 @@ -#version 430 core - -layout (location = 0) out vec4 FragColor; -layout (location = 1) out vec4 BrightColor; - -struct PointLight { - vec3 position; - vec3 color; - float intensity; -}; - -#define NR_POINT_LIGHTS 5 - -uniform vec3 objectColor; -uniform vec3 cameraPos; -uniform sampler2D colorTexture; -uniform PointLight pointLights[NR_POINT_LIGHTS]; - -in vec3 interpNormal; -in vec3 fragPos; -in vec2 vTexCoord; - - - -void main() -{ - vec3 fragColor = vec3(0,0,0); - vec4 textureColor = texture2D(colorTexture, vTexCoord); - vec4 ambient = vec4(0.1, 0.1, 0.1, 1.0) * textureColor; - vec3 normal = normalize(interpNormal); - for(int i = 0; i < NR_POINT_LIGHTS; i++) - { - vec3 lightDir = normalize(pointLights[i].position - fragPos); - - vec3 V = normalize(cameraPos-fragPos); - vec3 R = reflect(-lightDir,normal); - - float dist = distance(fragPos, pointLights[i].position) / 5; - float distance = (1/dist) * (1/dist); - - float spec = pow(max(0,dot(R,V)),2); - float diff = max(0,dot(normal,normalize(lightDir))); - - vec3 diffuse = pointLights[i].color * diff * distance * pointLights[i].intensity; - vec3 specular = spec * pointLights[i].color * (pointLights[i].intensity/dist); - - vec3 texture = vec3(textureColor.x, textureColor.y, textureColor.z); // * pointLights[i].color; - fragColor += mix(texture,texture*diffuse+vec3(1)*specular,0.9); - } - - BrightColor = vec4(0.0, 0.0, 0.0, 1.0); - FragColor = vec4(fragColor, 1.0) + ambient; -} diff --git a/shaders/shader_4_tex.vert b/shaders/shader_4_tex.vert deleted file mode 100644 index efd1d17..0000000 --- a/shaders/shader_4_tex.vert +++ /dev/null @@ -1,20 +0,0 @@ -#version 430 core - -layout(location = 0) in vec3 vertexPosition; -layout(location = 1) in vec2 vertexTexCoord; -layout(location = 2) in vec3 vertexNormal; - -uniform mat4 transformation; -uniform mat4 modelMatrix; - -out vec3 interpNormal; -out vec3 fragPos; -out vec2 vTexCoord; - -void main() -{ - gl_Position = transformation * vec4(vertexPosition, 1.0); - interpNormal = (modelMatrix*vec4(vertexNormal,0)).xyz; - fragPos = (modelMatrix*vec4(vertexPosition,1)).xyz; - vTexCoord = vertexTexCoord; -} diff --git a/shaders/shader_bloom3.frag b/shaders/shader_bloom.frag similarity index 62% rename from shaders/shader_bloom3.frag rename to shaders/shader_bloom.frag index c5b8714..14887d7 100644 --- a/shaders/shader_bloom3.frag +++ b/shaders/shader_bloom.frag @@ -8,13 +8,11 @@ uniform sampler2D bloomBlur; void main() { - const float gamma = 2.2; + const float gamma = 1.2; vec3 hdrColor = texture(scene, vTexCoords).rgb; vec3 bloomColor = texture(bloomBlur, vTexCoords).rgb; - hdrColor += bloomColor; // additive blending - // tone mapping - vec3 result = vec3(1.0) - exp(-hdrColor * 1.0f); - // also gamma correct while we're at it + hdrColor += bloomColor; + vec3 result = vec3(1.0) - exp(-hdrColor * 1.0f); result = pow(result, vec3(1.0 / gamma)); FragColor = vec4(result, 1.0); } \ No newline at end of file diff --git a/shaders/shader_bloom2.vert b/shaders/shader_bloom.vert similarity index 100% rename from shaders/shader_bloom2.vert rename to shaders/shader_bloom.vert diff --git a/shaders/shader_bloom1.vert b/shaders/shader_bloom1.vert deleted file mode 100644 index d86f709..0000000 --- a/shaders/shader_bloom1.vert +++ /dev/null @@ -1,19 +0,0 @@ -#version 430 core - -layout(location = 0) in vec3 vertexPosition; -layout(location = 1) in vec2 vertexTexCoord; -layout(location = 2) in vec3 vertexNormal; - -uniform mat4 transformation; -uniform mat4 modelMatrix; -out vec3 interpNormal; -out vec3 fragPos; -out vec2 vTexCoord; - -void main() -{ - gl_Position = transformation * vec4(vertexPosition, 1.0); - interpNormal = (modelMatrix*vec4(vertexNormal,0)).xyz; - fragPos = (modelMatrix*vec4(vertexPosition,1)).xyz; - vTexCoord = vertexTexCoord; -} diff --git a/shaders/shader_bloom2.frag b/shaders/shader_blur.frag similarity index 100% rename from shaders/shader_bloom2.frag rename to shaders/shader_blur.frag diff --git a/shaders/shader_bloom3.vert b/shaders/shader_blur.vert similarity index 100% rename from shaders/shader_bloom3.vert rename to shaders/shader_blur.vert diff --git a/shaders/shader_skybox.frag b/shaders/shader_skybox.frag index 5d0e53e..b6bafcb 100644 --- a/shaders/shader_skybox.frag +++ b/shaders/shader_skybox.frag @@ -1,5 +1,6 @@ #version 330 core -out vec4 FragColor; +layout (location = 0) out vec4 FragColor; +layout (location = 1) out vec4 BrightColor; in vec3 TexCoords; @@ -8,4 +9,5 @@ uniform samplerCube skybox; void main() { FragColor = texture(skybox, TexCoords); + BrightColor = vec4(0,0,0,1.0); } \ No newline at end of file diff --git a/shaders/shader_skybox.vert b/shaders/shader_skybox.vert index f92b356..c6b0d8a 100644 --- a/shaders/shader_skybox.vert +++ b/shaders/shader_skybox.vert @@ -8,5 +8,5 @@ uniform mat4 transformation; void main() { TexCoords = vertexPosition; - gl_Position = transformation * vec4(vertexPosition, 1.0); + gl_Position = (transformation * vec4(vertexPosition, 1.0)).xyww; } \ No newline at end of file diff --git a/shaders/shader_bloom1.frag b/shaders/shader_sun.frag similarity index 97% rename from shaders/shader_bloom1.frag rename to shaders/shader_sun.frag index 19d8800..4697951 100644 --- a/shaders/shader_bloom1.frag +++ b/shaders/shader_sun.frag @@ -21,7 +21,7 @@ void main() FragColor = vec4(texture + texture * coef, 1.0); float brightness = dot(FragColor.rgb, vec3(0.2, 0.7, 0.07)); - if(brightness > 1.0) + if(brightness > 0.7) BrightColor = vec4(FragColor.rgb, 1.0); else BrightColor = vec4(0.0, 0.0, 0.0, 1.0); diff --git a/shaders/shader_4_sun.vert b/shaders/shader_sun.vert similarity index 100% rename from shaders/shader_4_sun.vert rename to shaders/shader_sun.vert diff --git a/src/main 2.2.cpp b/src/main 2.2.cpp deleted file mode 100644 index d05e99c..0000000 --- a/src/main 2.2.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include "glew.h" -#include "freeglut.h" -#include "glm.hpp" -#include "ext.hpp" -#include -#include -#include - -#include "Shader_Loader.h" -#include "Render_Utils.h" -#include "Camera.h" - - -#include "Box.cpp" - -#include -#include -#include - - -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" - -GLuint program; -GLuint programSun; -Core::Shader_Loader shaderLoader; - - -Core::RenderContext armContext; - - -std::vector armContexts; -std::vector arm; -int ballIndex; - - -float cameraAngle = 0; -glm::vec3 cameraPos = glm::vec3(-6, 0, 0); -glm::vec3 cameraDir; - -glm::mat4 cameraMatrix, perspectiveMatrix; - -void keyboard(unsigned char key, int x, int y) -{ - float angleSpeed = 0.1f; - float moveSpeed = 0.1f; - switch (key) - { - case 'z': cameraAngle -= angleSpeed; break; - case 'x': cameraAngle += angleSpeed; break; - case 'w': cameraPos += cameraDir * moveSpeed; break; - case 's': cameraPos -= cameraDir * moveSpeed; break; - case 'd': cameraPos += glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'a': cameraPos -= glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'e': cameraPos += glm::cross(cameraDir, glm::vec3(1, 0, 0)) * moveSpeed; break; - case 'q': cameraPos -= glm::cross(cameraDir, glm::vec3(1, 0, 0)) * moveSpeed; break; - } -} - -glm::mat4 createCameraMatrix() -{ - // Obliczanie kierunku patrzenia kamery (w plaszczyznie x-z) przy uzyciu zmiennej cameraAngle kontrolowanej przez klawisze. - cameraDir = glm::vec3(cosf(cameraAngle), 0.0f, sinf(cameraAngle)); - glm::vec3 up = glm::vec3(0, 1, 0); - - return Core::createViewMatrix(cameraPos, cameraDir, up); -} - -void drawObject(GLuint program, Core::RenderContext context, glm::mat4 modelMatrix, glm::vec3 color) -{ - glUniform3f(glGetUniformLocation(program, "objectColor"), color.x, color.y, color.z); - - glm::mat4 transformation = perspectiveMatrix * cameraMatrix * modelMatrix; - - - glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); - glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); - - Core::DrawContext(context); -} - -void renderScene() -{ - // Aktualizacja macierzy widoku i rzutowania. Macierze sa przechowywane w zmiennych globalnych, bo uzywa ich funkcja drawObject. - // (Bardziej elegancko byloby przekazac je jako argumenty do funkcji, ale robimy tak dla uproszczenia kodu. - // Jest to mozliwe dzieki temu, ze macierze widoku i rzutowania sa takie same dla wszystkich obiektow!) - cameraMatrix = createCameraMatrix(); - perspectiveMatrix = Core::createPerspectiveMatrix(); - float time = glutGet(GLUT_ELAPSED_TIME) / 1000.f; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glClearColor(0.0f, 0.3f, 0.3f, 1.0f); - - glUseProgram(program); - - // Macierz statku "przyczpeia" go do kamery. Wrato przeanalizowac te linijke i zrozumiec jak to dziala. - glm::vec3 lightPos = glm::vec3(-4, 1, -4); - //glUniform3f(glGetUniformLocation(program, "light_dir"), 2, 1, 0); - glUniform3f(glGetUniformLocation(program, "lightPos"), lightPos.x, lightPos.y, lightPos.z); - glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); - float y = 0; - for (auto context : armContexts) { - drawObject(program, context, glm::translate(glm::vec3(0, y, 0)), glm::vec3(0.6f)); - y += 0.1; - } - - glUseProgram(0); - glutSwapBuffers(); -} -void loadRecusive(const aiScene* scene, aiNode* node) { - for (int i = 0; i < node->mNumMeshes; i++) { - Core::RenderContext context; - context.initFromAssimpMesh(scene->mMeshes[node->mMeshes[i]]); - armContexts.push_back(context); - } - for (int i = 0; i < node->mNumChildren; i++) { - loadRecusive(scene, node->mChildren[i]); - } -} - - -void init() -{ - glEnable(GL_DEPTH_TEST); - program = shaderLoader.CreateProgram("shaders/shader_4_1.vert", "shaders/shader_4_1.frag"); - programSun = shaderLoader.CreateProgram("shaders/shader_4_sun.vert", "shaders/shader_4_sun.frag"); - - - Assimp::Importer importer; - const aiScene* scene = importer.ReadFile("models/arm.fbx", aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_CalcTangentSpace); - // check for errors - if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) // if is Not Zero - { - std::cout << "ERROR::ASSIMP:: " << importer.GetErrorString() << std::endl; - return; - } - auto node = scene->mRootNode->mChildren[0]; - aiMesh* mesh = scene->mMeshes[node->mMeshes[0]]; - loadRecusive(scene,scene->mRootNode); - -} - -void shutdown() -{ - shaderLoader.DeleteProgram(program); -} - -void idle() -{ - glutPostRedisplay(); -} - -int main(int argc, char** argv) -{ - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); - glutInitWindowPosition(200, 300); - glutInitWindowSize(600, 600); - glutCreateWindow("OpenGL Pierwszy Program"); - glewInit(); - - init(); - glutKeyboardFunc(keyboard); - glutDisplayFunc(renderScene); - glutIdleFunc(idle); - - glutMainLoop(); - - shutdown(); - - return 0; -} diff --git a/src/main 3.cpp b/src/main 3.cpp deleted file mode 100644 index f8e1bc0..0000000 --- a/src/main 3.cpp +++ /dev/null @@ -1,184 +0,0 @@ -#include "glew.h" -#include "freeglut.h" -#include "glm.hpp" -#include "ext.hpp" -#include -#include -#include - -#include "Shader_Loader.h" -#include "Render_Utils.h" -#include "Camera.h" - - -#include "Box.cpp" - -#include -#include -#include - - -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" - -GLuint program; -GLuint programSun; -Core::Shader_Loader shaderLoader; - - -Core::RenderContext armContext; - - -std::vector armContexts; - -std::vector arm; -int ballIndex; - -float cameraAngle = 0; -glm::vec3 cameraPos = glm::vec3(-6, 0, 0); -glm::vec3 cameraDir; - -glm::mat4 cameraMatrix, perspectiveMatrix; - -void keyboard(unsigned char key, int x, int y) -{ - float angleSpeed = 0.1f; - float moveSpeed = 0.1f; - switch (key) - { - case 'z': cameraAngle -= angleSpeed; break; - case 'x': cameraAngle += angleSpeed; break; - case 'w': cameraPos += cameraDir * moveSpeed; break; - case 's': cameraPos -= cameraDir * moveSpeed; break; - case 'd': cameraPos += glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'a': cameraPos -= glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'e': cameraPos += glm::cross(cameraDir, glm::vec3(1, 0, 0)) * moveSpeed; break; - case 'q': cameraPos -= glm::cross(cameraDir, glm::vec3(1, 0, 0)) * moveSpeed; break; - } -} - -glm::mat4 createCameraMatrix() -{ - // Obliczanie kierunku patrzenia kamery (w plaszczyznie x-z) przy uzyciu zmiennej cameraAngle kontrolowanej przez klawisze. - cameraDir = glm::vec3(cosf(cameraAngle), 0.0f, sinf(cameraAngle)); - glm::vec3 up = glm::vec3(0, 1, 0); - - return Core::createViewMatrix(cameraPos, cameraDir, up); -} - -void drawObject(GLuint program, Core::RenderContext context, glm::mat4 modelMatrix, glm::vec3 color) -{ - glUniform3f(glGetUniformLocation(program, "objectColor"), color.x, color.y, color.z); - - glm::mat4 transformation = perspectiveMatrix * cameraMatrix * modelMatrix; - - - glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); - glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); - - Core::DrawContext(context); -} - -void renderScene() -{ - // Aktualizacja macierzy widoku i rzutowania. Macierze sa przechowywane w zmiennych globalnych, bo uzywa ich funkcja drawObject. - // (Bardziej elegancko byloby przekazac je jako argumenty do funkcji, ale robimy tak dla uproszczenia kodu. - // Jest to mozliwe dzieki temu, ze macierze widoku i rzutowania sa takie same dla wszystkich obiektow!) - cameraMatrix = createCameraMatrix(); - perspectiveMatrix = Core::createPerspectiveMatrix(); - float time = glutGet(GLUT_ELAPSED_TIME) / 1000.f; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glClearColor(0.0f, 0.3f, 0.3f, 1.0f); - - glUseProgram(program); - - // Macierz statku "przyczpeia" go do kamery. Wrato przeanalizowac te linijke i zrozumiec jak to dziala. - glm::vec3 lightPos = glm::vec3(-4, 1, -4); - //glUniform3f(glGetUniformLocation(program, "light_dir"), 2, 1, 0); - glUniform3f(glGetUniformLocation(program, "lightPos"), lightPos.x, lightPos.y, lightPos.z); - glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); - for (auto part : arm) { - glm::mat4 transformation=part.matrix; - int parent = part.parent; - while (parent != -1) { - transformation = arm[parent].matrix * transformation; - parent = arm[parent].parent; - } - for (auto context : part.renderContexts) drawObject(program, context, transformation, glm::vec3(0.6f)); - } - - glUseProgram(0); - glutSwapBuffers(); -} -void loadRecusive(const aiScene* scene, aiNode* node,int parentIndex) { - int index = arm.size(); - arm.push_back(Core::Node()); - arm[index].parent = parentIndex; - arm[index].matrix = Core::mat4_cast(node->mTransformation); - for (int i = 0; i < node->mNumMeshes; i++) { - Core::RenderContext context; - context.initFromAssimpMesh(scene->mMeshes[node->mMeshes[i]]); - arm[index].renderContexts.push_back(context); - } - for (int i = 0; i < node->mNumChildren; i++) { - loadRecusive(scene, node->mChildren[i],index); - } -} - - -void init() -{ - glEnable(GL_DEPTH_TEST); - program = shaderLoader.CreateProgram("shaders/shader_4_1.vert", "shaders/shader_4_1.frag"); - programSun = shaderLoader.CreateProgram("shaders/shader_4_sun.vert", "shaders/shader_4_sun.frag"); - - - Assimp::Importer importer; - const aiScene* scene = importer.ReadFile("models/arm.fbx", aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_CalcTangentSpace); - // check for errors - if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) // if is Not Zero - { - std::cout << "ERROR::ASSIMP:: " << importer.GetErrorString() << std::endl; - return; - } - auto node = scene->mRootNode->mChildren[0]; - - //geting name of node - //std::cout << node->mName.data << std::endl; - //aiMesh* mesh = scene->mMeshes[node->mMeshes[0]]; - - loadRecusive(scene,scene->mRootNode,-1); - -} - -void shutdown() -{ - shaderLoader.DeleteProgram(program); -} - -void idle() -{ - glutPostRedisplay(); -} - -int main(int argc, char** argv) -{ - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); - glutInitWindowPosition(200, 300); - glutInitWindowSize(600, 600); - glutCreateWindow("OpenGL Pierwszy Program"); - glewInit(); - - init(); - glutKeyboardFunc(keyboard); - glutDisplayFunc(renderScene); - glutIdleFunc(idle); - - glutMainLoop(); - - shutdown(); - - return 0; -} diff --git a/src/main 4.cpp b/src/main 4.cpp deleted file mode 100644 index 946b014..0000000 --- a/src/main 4.cpp +++ /dev/null @@ -1,189 +0,0 @@ -#include "glew.h" -#include "freeglut.h" -#include "glm.hpp" -#include "ext.hpp" -#include -#include -#include - -#include "Shader_Loader.h" -#include "Render_Utils.h" -#include "Camera.h" - - -#include "Box.cpp" - -#include -#include -#include - - -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" - -GLuint program; -GLuint programSun; -Core::Shader_Loader shaderLoader; - - -Core::RenderContext armContext; - - -std::vector armContexts; - -std::vector arm; -int ballIndex; - -float cameraAngle = 0; -glm::vec3 cameraPos = glm::vec3(-6, 0, 0); -glm::vec3 cameraDir; - -glm::mat4 cameraMatrix, perspectiveMatrix; - -void keyboard(unsigned char key, int x, int y) -{ - float angleSpeed = 0.1f; - float moveSpeed = 0.1f; - switch (key) - { - case 'z': cameraAngle -= angleSpeed; break; - case 'x': cameraAngle += angleSpeed; break; - case 'w': cameraPos += cameraDir * moveSpeed; break; - case 's': cameraPos -= cameraDir * moveSpeed; break; - case 'd': cameraPos += glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'a': cameraPos -= glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'e': cameraPos += glm::cross(cameraDir, glm::vec3(1, 0, 0)) * moveSpeed; break; - case 'q': cameraPos -= glm::cross(cameraDir, glm::vec3(1, 0, 0)) * moveSpeed; break; - case 'o': arm[ballIndex].matrix *= glm::eulerAngleZ(0.03f); break; - case 'p': arm[ballIndex].matrix *= glm::eulerAngleZ(-0.03f); break; - } -} - -glm::mat4 createCameraMatrix() -{ - // Obliczanie kierunku patrzenia kamery (w plaszczyznie x-z) przy uzyciu zmiennej cameraAngle kontrolowanej przez klawisze. - cameraDir = glm::vec3(cosf(cameraAngle), 0.0f, sinf(cameraAngle)); - glm::vec3 up = glm::vec3(0, 1, 0); - - return Core::createViewMatrix(cameraPos, cameraDir, up); -} - -void drawObject(GLuint program, Core::RenderContext context, glm::mat4 modelMatrix, glm::vec3 color) -{ - glUniform3f(glGetUniformLocation(program, "objectColor"), color.x, color.y, color.z); - - glm::mat4 transformation = perspectiveMatrix * cameraMatrix * modelMatrix; - - - glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix); - glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation); - - Core::DrawContext(context); -} - -void renderScene() -{ - // Aktualizacja macierzy widoku i rzutowania. Macierze sa przechowywane w zmiennych globalnych, bo uzywa ich funkcja drawObject. - // (Bardziej elegancko byloby przekazac je jako argumenty do funkcji, ale robimy tak dla uproszczenia kodu. - // Jest to mozliwe dzieki temu, ze macierze widoku i rzutowania sa takie same dla wszystkich obiektow!) - cameraMatrix = createCameraMatrix(); - perspectiveMatrix = Core::createPerspectiveMatrix(); - float time = glutGet(GLUT_ELAPSED_TIME) / 1000.f; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glClearColor(0.0f, 0.3f, 0.3f, 1.0f); - - glUseProgram(program); - - // Macierz statku "przyczpeia" go do kamery. Wrato przeanalizowac te linijke i zrozumiec jak to dziala. - glm::vec3 lightPos = glm::vec3(-4, 1, -4); - //glUniform3f(glGetUniformLocation(program, "light_dir"), 2, 1, 0); - glUniform3f(glGetUniformLocation(program, "lightPos"), lightPos.x, lightPos.y, lightPos.z); - glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); - for (auto part : arm) { - glm::mat4 transformation=part.matrix; - int parent = part.parent; - while (parent != -1) { - transformation = arm[parent].matrix * transformation; - parent = arm[parent].parent; - } - for (auto context : part.renderContexts) drawObject(program, context, transformation, glm::vec3(0.6f)); - } - - glUseProgram(0); - glutSwapBuffers(); -} -void loadRecusive(const aiScene* scene, aiNode* node,int parentIndex) { - int index = arm.size(); - arm.push_back(Core::Node()); - arm[index].parent = parentIndex; - arm[index].matrix = Core::mat4_cast(node->mTransformation); - if (node->mName == aiString("Ball")) { - ballIndex = index; - } - for (int i = 0; i < node->mNumMeshes; i++) { - Core::RenderContext context; - context.initFromAssimpMesh(scene->mMeshes[node->mMeshes[i]]); - arm[index].renderContexts.push_back(context); - } - for (int i = 0; i < node->mNumChildren; i++) { - loadRecusive(scene, node->mChildren[i],index); - } -} - - -void init() -{ - glEnable(GL_DEPTH_TEST); - program = shaderLoader.CreateProgram("shaders/shader_4_1.vert", "shaders/shader_4_1.frag"); - programSun = shaderLoader.CreateProgram("shaders/shader_4_sun.vert", "shaders/shader_4_sun.frag"); - - - Assimp::Importer importer; - const aiScene* scene = importer.ReadFile("models/arm.fbx", aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_CalcTangentSpace); - // check for errors - if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) // if is Not Zero - { - std::cout << "ERROR::ASSIMP:: " << importer.GetErrorString() << std::endl; - return; - } - auto node = scene->mRootNode->mChildren[0]; - - //geting name of node - //std::cout << node->mName.data << std::endl; - //aiMesh* mesh = scene->mMeshes[node->mMeshes[0]]; - - loadRecusive(scene,scene->mRootNode,-1); - -} - -void shutdown() -{ - shaderLoader.DeleteProgram(program); -} - -void idle() -{ - glutPostRedisplay(); -} - -int main(int argc, char** argv) -{ - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); - glutInitWindowPosition(200, 300); - glutInitWindowSize(600, 600); - glutCreateWindow("OpenGL Pierwszy Program"); - glewInit(); - - init(); - glutKeyboardFunc(keyboard); - glutDisplayFunc(renderScene); - glutIdleFunc(idle); - - glutMainLoop(); - - shutdown(); - - return 0; -} diff --git a/src/main.cpp b/src/main.cpp index d460508..329cbdd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,15 +25,10 @@ int SCR_HEIGHT = 720; #include "stb_image.h" //int winId; GLuint programTex; -GLuint programSun; GLuint programSkybox; - - - - -GLuint programBloom1; -GLuint programBloom2; -GLuint programBloom3; +GLuint programSun; +GLuint programBlur; +GLuint programBloom; unsigned int pingpongFBO[2]; unsigned int pingpongColorbuffers[2]; @@ -109,7 +104,7 @@ void keyboard(unsigned char key, int x, int y) case 'q': { cameraAngle -= angleSpeed; - lights[3].intensity = 0.001; + lights[3].intensity = 0.005; engineLightTimer = 0; break; } @@ -117,7 +112,7 @@ void keyboard(unsigned char key, int x, int y) case 'e': { cameraAngle += angleSpeed; - lights[2].intensity = 0.001; + lights[2].intensity = 0.005; engineLightTimer = 0; break; } @@ -125,8 +120,8 @@ void keyboard(unsigned char key, int x, int y) case 'w': { cameraPos += cameraDir * moveSpeed; - lights[2].intensity = 0.001; - lights[3].intensity = 0.001; + lights[2].intensity = 0.005; + lights[3].intensity = 0.005; engineLightTimer = 0; break; } @@ -138,8 +133,7 @@ void keyboard(unsigned char key, int x, int y) } } -// renderQuad() renders a 1x1 XY quad in NDC -// ----------------------------------------- + unsigned int quadVAO = 0; unsigned int quadVBO; void renderQuad() @@ -147,13 +141,11 @@ void renderQuad() if (quadVAO == 0) { float quadVertices[] = { - // positions // texture Coords -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, }; - // setup plane VAO glGenVertexArrays(1, &quadVAO); glGenBuffers(1, &quadVBO); glBindVertexArray(quadVAO); @@ -315,7 +307,6 @@ void renderScene() glBindFramebuffer(GL_FRAMEBUFFER, FBO); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - //ustalanie pozycji slonc (lightPos) glm::mat4 sunModelMatrix = glm::mat4(1.0f); @@ -325,20 +316,20 @@ void renderScene() glm::mat4 sunModelMatrix2 = glm::mat4(1.0f); sunModelMatrix2 = glm::translate(sunModelMatrix2, sunPos2); + glm::mat4 crewmateModelMatrix = glm::translate(glm::vec3(0, 1, 1)) * glm::rotate(time / 2, glm::vec3(1, 0, 1)) * glm::scale(glm::vec3(0.1)); + glm::mat4 shipModelMatrix = glm::translate(cameraPos + cameraDir * 0.6f + glm::vec3(0, -0.25f, 0)) * glm::rotate(-cameraAngle + glm::radians(90.0f), glm::vec3(0, 1, 0)) * glm::scale(glm::vec3(0.0001f)); + + glUseProgram(programTex); - - lights[0].position = sunPos; lights[1].position = sunPos2; - - glm::mat4 shipModelMatrix = glm::translate(cameraPos + cameraDir * 0.6f + glm::vec3(0, -0.25f, 0)) * glm::rotate(-cameraAngle + glm::radians(90.0f), glm::vec3(0, 1, 0)) * glm::scale(glm::vec3(0.0001f)); - glm::mat4 engineLeft = glm::translate(shipModelMatrix, glm::vec3(500,0,-1500)); + + glm::mat4 engineLeft = glm::translate(shipModelMatrix, glm::vec3(700,0,-1500)); lights[2].position = glm::vec3(engineLeft[3][0], engineLeft[3][1], engineLeft[3][2]); - glm::mat4 engineRight = glm::translate(shipModelMatrix, glm::vec3(-500, 0, -1500)); + glm::mat4 engineRight = glm::translate(shipModelMatrix, glm::vec3(-700, 0, -1500)); lights[3].position = glm::vec3(engineRight[3][0], engineRight[3][1], engineRight[3][2]); - for (int i = 0; i < lights.size(); i++) { @@ -352,50 +343,33 @@ void renderScene() glUniform3f(glGetUniformLocation(programTex, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); - - //rysowanie statku - //glm::mat4 shipModelMatrix = glm::translate(cameraPos + cameraDir * 0.6f + glm::vec3(0, -0.25f, 0)) * glm::rotate(-cameraAngle + glm::radians(90.0f), glm::vec3(0, 1, 0)) * glm::scale(glm::vec3(0.0001f)); - drawFromAssimpModel(programTex, corvette, shipModelMatrix, glm::vec3(1)); - - glm::mat4 crewmateModelMatrix = glm::translate(glm::vec3(0, 1, 1)) * glm::rotate(time/2, glm::vec3(1, 0, 1)) * glm::scale(glm::vec3(0.1)); drawFromAssimpModel(programTex, crewmate, crewmateModelMatrix, glm::vec3(1)); - - - - //rysowanie Ziemi z ksiê¿ycem + //rysowanie Ziemi z ksiezycem glm::mat4 earth = drawPlanet(time / 5.0f, sunPos*glm::vec3(1.5f,1,1), glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(-10.5f, 0.0f, -10.5f), glm::vec3(0.5f, 0.5f, 0.5f)); glm::mat4 moon = drawMoon(earth, time/2.0f, glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0, 1, 1), glm::vec3(1.5f, 1.0f, 1.0f), glm::vec3(0.3f, 0.3f, 0.3f)); earth = glm::rotate(earth, time/3.0f, glm::vec3(0.0f, 0.0f, 1.0f)); drawObjectTexture(programTex, sphereContext, earth, glm::vec3(0.8f, 0.8f, 0.8f), earthTexture); drawObjectTexture(programTex, sphereContext, moon, glm::vec3(0.9f, 1.0f, 0.9f), moonTexture); + glUseProgram(programSun); + glUniform3f(glGetUniformLocation(programSun, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); - - //rysowanie sloñc - - glUseProgram(programBloom1); - glUniform3f(glGetUniformLocation(programBloom1, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); - drawObjectTexture(programBloom1, sphereContext, sunModelMatrix, glm::vec3(3.5f, 3.8f, 3.8f), sunTexture); - - drawObjectTexture(programBloom1, sphereContext, sunModelMatrix2, glm::vec3(0.9f, 0.9f, 2.0f), sunTexture); - - + drawObjectTexture(programSun, sphereContext, sunModelMatrix, glm::vec3(3.5f, 3.8f, 3.8f), sunTexture); + drawObjectTexture(programSun, sphereContext, sunModelMatrix2, glm::vec3(0.9f, 0.9f, 2.0f), sunTexture); drawSkybox(programSkybox, cubeContext, skyboxTexture); - //zabawa z bloomem glBindFramebuffer(GL_FRAMEBUFFER, 0); bool horizontal = true, first_iteration = true; unsigned int amount = 10; - glUseProgram(programBloom2); + glUseProgram(programBlur); for (unsigned int i = 0; i < amount; i++) { glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[horizontal]); - //shaderBlur.setInt("horizontal", horizontal); - glUniform1i(glGetUniformLocation(programBloom2, "horizontal"), horizontal); - glBindTexture(GL_TEXTURE_2D, first_iteration ? colorBuffers[1] : pingpongColorbuffers[!horizontal]); // bind texture of other framebuffer (or scene if first iteration) + glUniform1i(glGetUniformLocation(programBlur, "horizontal"), horizontal); + glBindTexture(GL_TEXTURE_2D, first_iteration ? colorBuffers[1] : pingpongColorbuffers[!horizontal]); renderQuad(); horizontal = !horizontal; if (first_iteration) @@ -403,10 +377,7 @@ void renderScene() } glBindFramebuffer(GL_FRAMEBUFFER, 0); - // 3. now render floating point color buffer to 2D quad and tonemap HDR colors to default framebuffer's (clamped) color range - // -------------------------------------------------------------------------------------------------------------------------- - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glUseProgram(programBloom3); + glUseProgram(programBloom); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, colorBuffers[0]); glActiveTexture(GL_TEXTURE1); @@ -430,22 +401,17 @@ void init() { glEnable(GL_DEPTH_TEST); programTex = shaderLoader.CreateProgram("shaders/shader_tex.vert", "shaders/shader_tex.frag"); - programSun = shaderLoader.CreateProgram("shaders/shader_4_sun.vert", "shaders/shader_4_sun.frag"); programSkybox = shaderLoader.CreateProgram("shaders/shader_skybox.vert", "shaders/shader_skybox.frag"); + programSun = shaderLoader.CreateProgram("shaders/shader_sun.vert", "shaders/shader_sun.frag"); + programBlur = shaderLoader.CreateProgram("shaders/shader_blur.vert", "shaders/shader_blur.frag"); + programBloom = shaderLoader.CreateProgram("shaders/shader_bloom.vert", "shaders/shader_bloom.frag"); - - - - programBloom1 = shaderLoader.CreateProgram("shaders/shader_bloom1.vert", "shaders/shader_bloom1.frag"); - programBloom2 = shaderLoader.CreateProgram("shaders/shader_bloom2.vert", "shaders/shader_bloom2.frag"); - programBloom3 = shaderLoader.CreateProgram("shaders/shader_bloom3.vert", "shaders/shader_bloom3.frag"); - - glUseProgram(programBloom2); - glUniform1i(glGetUniformLocation(programBloom2, "image"), 0); - glUseProgram(programBloom3); - glUniform1i(glGetUniformLocation(programBloom3, "scene"), 0); - glUniform1i(glGetUniformLocation(programBloom3, "bloomBlur"), 1); - + glUseProgram(programBlur); + glUniform1i(glGetUniformLocation(programBlur, "image"), 0); + glUseProgram(programBloom); + glUniform1i(glGetUniformLocation(programBloom, "scene"), 0); + glUniform1i(glGetUniformLocation(programBloom, "bloomBlur"), 1); + glUseProgram(0); corvette = std::make_shared("models/Corvette-F3.obj"); @@ -462,8 +428,6 @@ void init() earthTexture = Core::LoadTexture("textures/earth2.png"); moonTexture = Core::LoadTexture("textures/moon.png"); skyboxTexture = loadCubemap(faces); - - glGenFramebuffers(1, &FBO); glBindFramebuffer(GL_FRAMEBUFFER, FBO); @@ -479,27 +443,22 @@ void init() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - // attach texture to framebuffer glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, colorBuffers[i], 0 ); } - // create and attach depth buffer (renderbuffer) unsigned int rboDepth; glGenRenderbuffers(1, &rboDepth); glBindRenderbuffer(GL_RENDERBUFFER, rboDepth); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, SCR_WIDTH, SCR_HEIGHT); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth); - // - // tell OpenGL which color attachments we'll use (of this framebuffer) for rendering + unsigned int attachments[2] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; glDrawBuffers(2, attachments); - // finally check if framebuffer is complete if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer not complete!" << std::endl; glBindFramebuffer(GL_FRAMEBUFFER, 0); - // ping-pong-framebuffer for blurring glGenFramebuffers(2, pingpongFBO); glGenTextures(2, pingpongColorbuffers); for (unsigned int i = 0; i < 2; i++) @@ -509,17 +468,13 @@ void init() glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // we clamp to the edge as the blur filter would otherwise sample repeated texture values! + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pingpongColorbuffers[i], 0); - // also check if framebuffers are complete (no need for depth buffer) if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer not complete!" << std::endl; } - - - Light l1; l1.position = sunPos; l1.color = glm::vec3(0.8f, 0.8f, 0.7f); @@ -544,21 +499,15 @@ void init() l4.intensity = 0.0001; lights.push_back(l4); - } void shutdown() { - + } void onReshape(int width, int height) { - // Kiedy rozmiar okna sie zmieni, obraz jest znieksztalcony. - // Dostosuj odpowiednio macierz perspektywy i viewport. - // Oblicz odpowiednio globalna zmienna "frustumScale". - // Ustaw odpowiednio viewport - zobacz: - // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewport.xhtml SCR_WIDTH = width; SCR_HEIGHT = height; frustumScale = (float)width / (float)height; @@ -584,11 +533,10 @@ int main(int argc, char** argv) init(); glutKeyboardFunc(keyboard); - //to sprawia, że obiekty ukryte przed kamerą nie są renderowane - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); -// glFrontFace(GL_CW); + //glEnable(GL_CULL_FACE); + //glCullFace(GL_BACK); + //glFrontFace(GL_CW); glutDisplayFunc(renderScene); glutIdleFunc(idle);