diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 3b3e479..7619514 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -440,6 +440,15 @@ public: } + void EnqueueWaterParticles(glm::vec3 position, glm::vec4 color) + { + WaterParticleJob job; + job.Position = position; + job.Color = color; + + m_RendererQueue.Deferred.Add(job); + } + private: std::shared_ptr m_ResourceManager; std::shared_ptr m_EventBroker; diff --git a/include/Core/RenderQueue.h b/include/Core/RenderQueue.h index 9984770..d0003b7 100755 --- a/include/Core/RenderQueue.h +++ b/include/Core/RenderQueue.h @@ -115,6 +115,12 @@ struct PointLightJob : RenderJob } }; +struct WaterParticleJob : RenderJob +{ + glm::vec3 Position; + glm::vec4 Color; +}; + class RenderQueue { public: @@ -153,12 +159,14 @@ struct RenderQueueCollection RenderQueue Deferred; RenderQueue Forward; RenderQueue Lights; + RenderQueue Water; void Clear() { Deferred.Clear(); Forward.Clear(); Lights.Clear(); + Water.Clear(); } void Sort() @@ -166,6 +174,8 @@ 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 1b8e078..2654db4 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -72,6 +72,7 @@ private: ShaderProgram* m_spDeferred3; ShaderProgram* m_spForward; ShaderProgram* m_spScreen; + ShaderProgram* t_m_spWater; GLuint m_ScreenQuad = 0; Model* m_UnitSphere = nullptr; @@ -89,6 +90,12 @@ private: GLuint m_tLighting = 0; GLuint m_fbDeferred3 = 0; GLuint m_tFinal = 0; + //Water "Diffuse" texture + GLuint t_m_GWater = 0; + //Water blur texture + GLuint t_m_tWater; + //WAterpass Framebuffer + GLuint t_m_fbWater; GLuint m_CurrentScreenBuffer = 0; void LoadShaders(); @@ -101,6 +108,7 @@ private: void DrawForward(RenderQueue &objects, RenderQueue &lights); void DrawScene(RenderQueue &objects, ShaderProgram &program); void DrawLightSpheres(RenderQueue &lights); + void DrawWater(RenderQueue &objects); void DebugKeys(); }; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 6534db1..3956336 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -149,6 +149,15 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + //WaterTest + glGenTextures(1, &t_m_GWater); + glBindTexture(GL_TEXTURE_2D, t_m_GWater); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_Resolution.Width, m_Resolution.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_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + // Create first pass framebuffer glGenFramebuffers(1, &m_fbDeferred1); @@ -158,8 +167,10 @@ void dd::Renderer::CreateBuffers() glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, m_GPosition, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, m_GNormal, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, m_GSpecular, 0); - GLenum firstPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; - glDrawBuffers(4, firstPassDrawBuffers); + //WaterTest + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_2D, t_m_GWater, 0); + GLenum firstPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4 }; + glDrawBuffers(5, firstPassDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { LOG_ERROR("m_fbDeferred1 incomplete: 0x%x\n", fbStatus); exit(EXIT_FAILURE); @@ -185,6 +196,26 @@ void dd::Renderer::CreateBuffers() exit(EXIT_FAILURE); } + //Blur the water + glGenTextures(1, &t_m_tWater); + glBindTexture(GL_TEXTURE_2D, t_m_tWater); + 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); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + //Blur water pass + glGenFramebuffers(1, &t_m_fbWater); + glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_tWater, 0); + GLenum waterPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, secondPassDrawBuffers); + if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + exit(EXIT_FAILURE); + } + // Generate final deferred texture glGenTextures(1, &m_tFinal); glBindTexture(GL_TEXTURE_2D, m_tFinal);