diff --git a/assets/Textures/Background.png b/assets/Textures/Background.png new file mode 100755 index 0000000..353a610 Binary files /dev/null and b/assets/Textures/Background.png differ diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 5b871b8..fa8a7fb 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -134,14 +134,26 @@ public: } //Halfpipe background test model. +// { +// auto t_halfPipe = m_World->CreateEntity(); +// auto transform = m_World->AddComponent(t_halfPipe); +// transform->Position = glm::vec3(0.f, 0.f, -15.f); +// transform->Scale = glm::vec3(15.f); +// auto model = m_World->AddComponent(t_halfPipe); +// model->ModelFile = "Models/Test/halfpipe/Halfpipe.obj"; +// model->Color = glm::vec4(1.f, 1.f, 1.f, 0.3f); +// m_World->CommitEntity(t_halfPipe); +// } + + //Background { - auto t_halfPipe = m_World->CreateEntity(); - auto transform = m_World->AddComponent(t_halfPipe); + auto background = m_World->CreateEntity(); + auto transform = m_World->AddComponent(background); transform->Position = glm::vec3(0.f, 0.f, -15.f); - transform->Scale = glm::vec3(15.f); - auto model = m_World->AddComponent(t_halfPipe); - model->ModelFile = "Models/Test/halfpipe/Halfpipe.obj"; - m_World->CommitEntity(t_halfPipe); + transform->Scale = glm::vec3(2681.f/100.f, 1080.f/100.f, 1.f); + auto sprite = m_World->AddComponent(background); + sprite->SpriteFile = "Textures/Background.png"; + m_World->CommitEntity(background); } //Water test @@ -159,7 +171,7 @@ public: { auto topWall = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(topWall); - transform->Position = glm::vec3(0.f, -3.f, -10.f); + transform->Position = glm::vec3(0.f, -3.f, -9.9f); transform->Scale = glm::vec3(3.f, 0.5f, 1.f); std::shared_ptr sprite = m_World->AddComponent(topWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; @@ -172,7 +184,7 @@ public: { auto topWall = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(topWall); - transform->Position = glm::vec3(1.5f, -1.5f, -10.f); + transform->Position = glm::vec3(1.5f, -1.5f, -9.9f); transform->Scale = glm::vec3(0.5f, 3.f, 1.f); std::shared_ptr sprite = m_World->AddComponent(topWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; @@ -185,7 +197,7 @@ public: { auto topWall = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(topWall); - transform->Position = glm::vec3(-1.5f, -1.5f, -10.f); + transform->Position = glm::vec3(-1.5f, -1.5f, -9.9f); transform->Scale = glm::vec3(0.5f, 3.0f, 1.f); std::shared_ptr sprite = m_World->AddComponent(topWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; @@ -366,7 +378,7 @@ public: Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) * glm::scale(absoluteTransform.Scale); - EnqueueWaterParticles(absoluteTransform.Position, glm::vec4(1.f, 1.f, 1.f, 1.f), modelMatrix); + EnqueueWaterParticles(absoluteTransform.Position, glm::vec4(1.f, 1.f, 1.f, 1.f), modelMatrix, absoluteTransform.Position.z); } } @@ -451,14 +463,15 @@ public: } - void EnqueueWaterParticles(glm::vec3 position, glm::vec4 color, glm::mat4 modelMatrix) + void EnqueueWaterParticles(glm::vec3 position, glm::vec4 color, glm::mat4 modelMatrix, float depth) { WaterParticleJob job; job.Position = position; job.Color = color; job.ModelMatrix = modelMatrix; + job.Depth = depth; - m_RendererQueue.Water.Add(job); + m_RendererQueue.Forward.Add(job); } private: diff --git a/include/Core/RenderQueue.h b/include/Core/RenderQueue.h index 8e698fc..a8d88e7 100755 --- a/include/Core/RenderQueue.h +++ b/include/Core/RenderQueue.h @@ -172,14 +172,12 @@ struct RenderQueueCollection RenderQueue Deferred; RenderQueue Forward; RenderQueue Lights; - RenderQueue Water; void Clear() { Deferred.Clear(); Forward.Clear(); Lights.Clear(); - Water.Clear(); } void Sort() @@ -187,8 +185,6 @@ struct RenderQueueCollection Deferred.Sort(); Forward.Sort(); Lights.Sort(); - //TODO: Is water sort needed? - Water.Sort(); } }; diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h index 844f42f..94a3259 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -112,7 +112,7 @@ private: static bool DepthSort(const std::shared_ptr &i, const std::shared_ptr &j) { return (i->Depth < j->Depth); } - void DrawDeferred(RenderQueue &objects, RenderQueue &lights, RenderQueue &waterParticles); + void DrawDeferred(RenderQueue &objects, RenderQueue &lights); void DrawForward(RenderQueue &objects, RenderQueue &lights); void DrawScene(RenderQueue &objects, ShaderProgram &program); void DrawLightSpheres(RenderQueue &lights); diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index b02684c..1fc2af3 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -243,6 +243,7 @@ void dd::Renderer::CreateBuffers() //water Blur texture2 glGenTextures(1, &t_m_BWater2); glBindTexture(GL_TEXTURE_2D, t_m_BWater2); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -284,13 +285,12 @@ void dd::Renderer::CreateBuffers() void dd::Renderer::Draw(RenderQueueCollection& rq) { - - DrawDeferred(rq.Deferred, rq.Lights, rq.Water); rq.Forward.Jobs.sort(dd::Renderer::DepthSort); + DrawDeferred(rq.Deferred, rq.Lights); DrawForward(rq.Forward, rq.Lights); // Finally: Draw the deferred+forward combined texture to the screen - glCullFace(GL_BACK); + glDisable(GL_CULL_FACE); glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); @@ -308,7 +308,7 @@ void dd::Renderer::Draw(RenderQueueCollection& rq) DebugKeys(); } -void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights, RenderQueue &waterParticles) +void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) { // Pass #1: Fill G-buffers glDisable(GL_CULL_FACE); @@ -323,18 +323,6 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights, Rende m_spDeferred1->Bind(); DrawScene(objects, *m_spDeferred1); - //WaterPass - glDisable(GL_CULL_FACE); - glCullFace(GL_BACK); - glDepthMask(GL_FALSE); - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); - glClearColor(0, 0, 0, 1); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - t_m_spWater->Bind(); - DrawWater(waterParticles); - // Pass #2: Lighting glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); @@ -344,7 +332,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights, Rende glBlendFunc(GL_ONE, GL_ONE); glDepthMask(GL_FALSE); glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred2); - glClearColor(0, 0, 0, 1); + glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); m_spDeferred2->Bind(); DrawLightSpheres(lights); @@ -353,7 +341,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights, Rende glCullFace(GL_BACK); glDisable(GL_BLEND); glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); - glClearColor(0, 0, 0, 1); + glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); m_spDeferred3->Bind(); glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.5f))); @@ -361,15 +349,12 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights, Rende glBindTexture(GL_TEXTURE_2D, m_GDiffuse); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_tLighting); - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, t_m_BWater2); glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); } void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) { - // Forward-render semi-transparent objects on top of the current framebuffer glDisable(GL_CULL_FACE); glCullFace(GL_BACK); @@ -385,6 +370,19 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) m_spForward->Bind(); DrawScene(objects, *m_spForward); + + //WaterPass + glDisable(GL_CULL_FACE); + glCullFace(GL_BACK); + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + t_m_spWater->Bind(); + DrawWater(objects); } void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) @@ -400,6 +398,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) if (modelJob) { glm::mat4 modelMatrix = modelJob->ModelMatrix; MVP = PV * modelMatrix; + glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); @@ -442,6 +441,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, spriteJob->DiffuseTexture); @@ -496,7 +496,7 @@ void dd::Renderer::DrawLightSpheres(RenderQueue &lights) } } -void dd::Renderer::DrawWater(RenderQueue &waterParticles) +void dd::Renderer::DrawWater(RenderQueue &rq) { GLuint shaderProgramHandle = *t_m_spWater; @@ -504,7 +504,7 @@ void dd::Renderer::DrawWater(RenderQueue &waterParticles) glm::mat4 viewMatrix = m_Camera->ViewMatrix(); glm::mat4 PV = projectionMatrix * viewMatrix; glm::mat4 MVP; - for ( auto &job : waterParticles ) { + for ( auto &job : rq ) { auto waterJob = std::dynamic_pointer_cast(job); if (waterJob) { glm::mat4 modelMatrix = waterJob->ModelMatrix; @@ -524,18 +524,23 @@ void dd::Renderer::DrawWater(RenderQueue &waterParticles) } } + + //blur1 shaderProgramHandle = *t_m_spWater2; - glCullFace(GL_BACK); - glDisable(GL_BLEND); + glDisable(GL_CULL_FACE); + glDepthMask(GL_FALSE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur); - glClearColor(0, 0, 0, 1); + glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); t_m_spWater2->Bind(); glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(1.0f, 0.0f))); - glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Height); - glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), 2.0f); + glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Width); + glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), 3.0f); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, t_m_Gwater); @@ -545,16 +550,17 @@ void dd::Renderer::DrawWater(RenderQueue &waterParticles) //blur2 shaderProgramHandle = *t_m_spWater2; - glCullFace(GL_BACK); - glDisable(GL_BLEND); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur2); - glClearColor(0, 0, 0, 1); - glClear(GL_COLOR_BUFFER_BIT); + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); t_m_spWater2->Bind(); glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(0.0f, 1.0f))); glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Height); - glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), 2.0f); + glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), 3.0f); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, t_m_BWater); @@ -659,6 +665,6 @@ void dd::Renderer::DebugKeys() m_CurrentScreenBuffer = m_tLighting; } if (glfwGetKey(m_Window, GLFW_KEY_F7)) { - m_CurrentScreenBuffer = t_m_BWater2; + m_CurrentScreenBuffer = t_m_BWater; } } diff --git a/src/game/Core/Shaders/Deferred/1/Fragment.glsl b/src/game/Core/Shaders/Deferred/1/Fragment.glsl old mode 100644 new mode 100755 index 927a681..8f7dbed --- a/src/game/Core/Shaders/Deferred/1/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/1/Fragment.glsl @@ -24,6 +24,7 @@ layout (binding = 2) uniform sampler2D SpecularMap; uniform mat4 V; uniform float MaterialShininess; +uniform vec4 Color; in VertexData { @@ -49,6 +50,7 @@ void main() { // Diffuse Texture GDiffuse = texture(DiffuseTexture, Input.TextureCoord) * Input.DiffuseColor; + GDiffuse = GDiffuse * Color; // G-buffer Position GPosition = vec4(Input.Position.xyz, 1.0); diff --git a/src/game/Core/Shaders/Deferred/3/Fragment.glsl b/src/game/Core/Shaders/Deferred/3/Fragment.glsl index 3f5f28c..61f54ac 100755 --- a/src/game/Core/Shaders/Deferred/3/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/3/Fragment.glsl @@ -22,7 +22,6 @@ uniform vec3 La; layout (binding=0) uniform sampler2D DiffuseTexture; layout (binding=1) uniform sampler2D LightingTexture; -layout (binding=2) uniform sampler2D WaterTexture; in VertexData { @@ -36,12 +35,11 @@ void main() { vec4 DiffuseTexel = texture(DiffuseTexture, Input.TextureCoord); vec4 LightingTexel = texture(LightingTexture, Input.TextureCoord); - vec4 WaterTexel = texture(WaterTexture, Input.TextureCoord); //frag_Diffuse = DiffuseTexel * (vec4(La, 0.0) * (vec4(LightingTexel.rgb, 0.0) + vec4(LightingTexel.a, LightingTexel.a, LightingTexel.a, 0.0))); //frag_Diffuse = DiffuseTexel * (vec4(La, 0.0) + LightingTexel); //frag_Diffuse = DiffuseTexel * (vec4(1.f, 1.f, 1.f, 0.0) + LightingTexel); - frag_Diffuse = DiffuseTexel + LightingTexel + WaterTexel; + frag_Diffuse = DiffuseTexel + LightingTexel; //frag_Diffuse = DiffuseTexel; //frag_Diffuse = vec4(LightingTexel.r, LightingTexel.g, LightingTexel.b, 1.0); } \ No newline at end of file diff --git a/src/game/Core/Shaders/Deferred/water2/Fragment.glsl b/src/game/Core/Shaders/Deferred/water2/Fragment.glsl index 17bbf52..b82af8f 100755 --- a/src/game/Core/Shaders/Deferred/water2/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/water2/Fragment.glsl @@ -65,6 +65,6 @@ void main() float avgColor = frag_Diffuse.r + frag_Diffuse.g + frag_Diffuse.b; avgColor = avgColor/3; if ( avgColor*dir.y > Threshhold ){ - frag_Diffuse = vec4(0.0, 0.6, 1.0, 1.0); + frag_Diffuse = vec4(0.0, 0.3, 1.0, 1.0); } } \ No newline at end of file