From 7c582898f47e36d0138635fd599776b24f83a270 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 4 Feb 2016 14:33:39 +0100 Subject: [PATCH] Working stencil buffer for the shield. --- include/Engine/Rendering/DrawFinalPass.h | 1 + include/Engine/Rendering/RenderState.h | 1 + .../Schema/Entities/QualityAssurance.xml | 44 ++++++++++--------- resources/Shaders/ShieldStencil.frag.glsl | 2 +- src/Engine/Rendering/DrawFinalPass.cpp | 13 ++++-- src/Engine/Rendering/DrawFinalPassState.cpp | 2 +- src/Engine/Rendering/FrameBuffer.cpp | 8 ++-- src/Engine/Rendering/RenderState.cpp | 2 +- 8 files changed, 41 insertions(+), 32 deletions(-) diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index 740c6ef6..64d5563e 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -50,6 +50,7 @@ private: GLuint m_BloomTexture; GLuint m_SceneTexture; GLuint m_DepthBuffer; + GLuint m_StencilBuffer; const IRenderer* m_Renderer; const LightCullingPass* m_LightCullingPass; diff --git a/include/Engine/Rendering/RenderState.h b/include/Engine/Rendering/RenderState.h index e8ace433..c1886247 100644 --- a/include/Engine/Rendering/RenderState.h +++ b/include/Engine/Rendering/RenderState.h @@ -2,6 +2,7 @@ #define RenderState_h__ #include +#include #include "../Common.h" #include "../OpenGL.h" #include "../GLM.h" diff --git a/resources/Schema/Entities/QualityAssurance.xml b/resources/Schema/Entities/QualityAssurance.xml index 11fbaf99..980cb39c 100644 --- a/resources/Schema/Entities/QualityAssurance.xml +++ b/resources/Schema/Entities/QualityAssurance.xml @@ -188,7 +188,7 @@ - + @@ -683,7 +683,7 @@ - + @@ -730,7 +730,7 @@ - + @@ -790,7 +790,7 @@ - + @@ -837,7 +837,7 @@ - + @@ -883,7 +883,7 @@ - + @@ -930,7 +930,7 @@ - + @@ -977,7 +977,7 @@ - + @@ -1390,7 +1390,7 @@ - + @@ -1399,7 +1399,7 @@ true - 1.3668564709912516 + 1.3671759474185377 3.7999999523162842 true @@ -1446,7 +1446,7 @@ - + @@ -1455,7 +1455,7 @@ - 0.316796204374441 + 0.31711568080172703 Models/Assault.mesh @@ -1498,7 +1498,7 @@ - + @@ -1513,7 +1513,7 @@ true - 0.316796204374441 + 0.31711568080172703 true @@ -1558,7 +1558,7 @@ - + @@ -1568,7 +1568,7 @@ true - 0.95015514958004132 + 0.95047462600732735 10 3 @@ -1616,7 +1616,7 @@ - + @@ -1626,7 +1626,7 @@ true - 1.3501834109561059 + 1.350502887383392 true 5 true @@ -1712,7 +1712,8 @@ - + + false 5 @@ -1723,7 +1724,7 @@ - + @@ -1806,7 +1807,7 @@ true - 1.3668564709912516 + 1.3671759474185377 3.7999999523162842 true @@ -1859,6 +1860,7 @@ Models/AssaultAnimated.mesh + diff --git a/resources/Shaders/ShieldStencil.frag.glsl b/resources/Shaders/ShieldStencil.frag.glsl index 43a067c0..bc114fc9 100644 --- a/resources/Shaders/ShieldStencil.frag.glsl +++ b/resources/Shaders/ShieldStencil.frag.glsl @@ -9,7 +9,7 @@ out vec4 fragmentColor; void main() { - fragmentColor = vec4(0.5, 0.5, 0.5, 1.0); + fragmentColor = vec4(0.5, 0.5, 0.5, 0.2); } diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index f571389f..106f9aa5 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -21,17 +21,18 @@ void DrawFinalPass::InitializeFrameBuffers() { glGenRenderbuffers(1, &m_DepthBuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); //GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); //GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4); - m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); + m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT))); m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new Texture2D(&m_SceneTexture, GL_COLOR_ATTACHMENT0))); m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new Texture2D(&m_BloomTexture, GL_COLOR_ATTACHMENT1))); m_FinalPassFrameBuffer.Generate(); + GLERROR("FBO generation"); } @@ -74,8 +75,10 @@ void DrawFinalPass::Draw(RenderScene& scene) glClear(GL_DEPTH_BUFFER_BIT); } //TODO: Do we need check for this or will it be per scene always? + glClearStencil(0x00); glClear(GL_STENCIL_BUFFER_BIT); + state->StencilMask(0x00); DrawModelRenderQueues(scene.Jobs.OpaqueObjects, scene); GLERROR("OpaqueObjects"); DrawModelRenderQueues(scene.Jobs.TransparentObjects, scene); @@ -89,11 +92,13 @@ void DrawFinalPass::Draw(RenderScene& scene) GLERROR("StencilPass"); //Draw Opaque shielded objects - //DrawShieldedModelRenderQueue(scene.Jobs.OpaqueShieldedObjects, scene); + state->StencilFunc(GL_NOTEQUAL, 1, 0xFF); + glStencilMask(0x00); + DrawShieldedModelRenderQueue(scene.Jobs.OpaqueShieldedObjects, scene); GLERROR("Shielded Opaque object"); //Draw Transparen Shielded objects - //DrawShieldedModelRenderQueue(scene.Jobs.TransparentShieldedObjects, scene); + DrawShieldedModelRenderQueue(scene.Jobs.TransparentShieldedObjects, scene); GLERROR("Shielded Transparent objects"); GLERROR("END"); diff --git a/src/Engine/Rendering/DrawFinalPassState.cpp b/src/Engine/Rendering/DrawFinalPassState.cpp index a1cd445c..8b5ddc8b 100644 --- a/src/Engine/Rendering/DrawFinalPassState.cpp +++ b/src/Engine/Rendering/DrawFinalPassState.cpp @@ -12,7 +12,7 @@ DrawFinalPassState::DrawFinalPassState(GLuint frameBuffer) Enable(GL_STENCIL_TEST); StencilFunc(GL_NOTEQUAL, 1, 0xFF); StencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); - StencilMask(0x00); + StencilMask(0xFF); ClearColor(glm::vec4(0.f, 0.f, 0.f, 0.f)); } diff --git a/src/Engine/Rendering/FrameBuffer.cpp b/src/Engine/Rendering/FrameBuffer.cpp index 9677f50e..5df1a5f1 100644 --- a/src/Engine/Rendering/FrameBuffer.cpp +++ b/src/Engine/Rendering/FrameBuffer.cpp @@ -57,17 +57,17 @@ void FrameBuffer::Generate() break; } - - if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) { + if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT || (*it)->m_Attachment != GL_STENCIL_ATTACHMENT || (*it)->m_Attachment != GL_DEPTH_STENCIL_ATTACHMENT) { attachments.push_back((*it)->m_Attachment); } } - + GLenum* bufferTextures = &attachments[0]; glDrawBuffers(attachments.size(), bufferTextures); if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus); + GLERROR("Framebuffer incomplete"); + //LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus); exit(EXIT_FAILURE); } } diff --git a/src/Engine/Rendering/RenderState.cpp b/src/Engine/Rendering/RenderState.cpp index 1bacda18..26ba18a1 100644 --- a/src/Engine/Rendering/RenderState.cpp +++ b/src/Engine/Rendering/RenderState.cpp @@ -137,7 +137,7 @@ bool RenderState::DepthMask(GLboolean flag) RenderState::~RenderState() { - for (auto& f : m_ResetFunctions) { + for (auto& f : boost::adaptors::reverse(m_ResetFunctions)) { f(); } }