diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index caf68f24..4cf88842 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -24,6 +24,8 @@ public: GLuint BloomTexture() const { return m_BloomTexture; } //Return the texture with diffuse and lighting of the scene. GLuint SceneTexture() const { return m_SceneTexture; } + FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; } + private: void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; diff --git a/include/Engine/Rendering/TextPass.h b/include/Engine/Rendering/TextPass.h index eaace1c2..8fbb3df0 100644 --- a/include/Engine/Rendering/TextPass.h +++ b/include/Engine/Rendering/TextPass.h @@ -11,6 +11,7 @@ #include "../Core/ResourceManager.h" #include "RenderQueue.h" #include "TextPassState.h" +#include "FrameBuffer.h" class TextPass { @@ -18,7 +19,7 @@ public: TextPass(); void Initialize(); void Update(); - void Draw(RenderScene& scene); + void Draw(RenderScene& scene, FrameBuffer& frameBuffer); private: void renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix); diff --git a/include/Engine/Rendering/TextPassState.h b/include/Engine/Rendering/TextPassState.h index 9bc25f26..fbed6356 100644 --- a/include/Engine/Rendering/TextPassState.h +++ b/include/Engine/Rendering/TextPassState.h @@ -6,7 +6,7 @@ class TextPassState : public RenderState { public: - TextPassState(); + TextPassState(GLuint frameBuffer); ~TextPassState(); private: diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index 6796736a..c08e4d0c 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -147,7 +147,7 @@ void main() color_result += FillColor; } //bloomColor = vec4(0.3, 0.8, 0.6, 1.0); - sceneColor = vec4(color_result.xyz, 1.0); + sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1)); //These if statements should be removed if they are slow. color_result += glowTexel; diff --git a/resources/Shaders/Text.frag.glsl b/resources/Shaders/Text.frag.glsl index 2726b5d1..3b0f9e28 100644 --- a/resources/Shaders/Text.frag.glsl +++ b/resources/Shaders/Text.frag.glsl @@ -3,10 +3,15 @@ in vec2 TexCoords; out vec4 color; uniform sampler2D text; -uniform vec3 textColor; +uniform vec4 textColor; + +out vec4 sceneColor; +out vec4 bloomColor; void main() { vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r); - color = vec4(textColor, 1.0) * sampled; + vec4 color_result = textColor * sampled; + sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1)); + bloomColor = vec4(clamp(color_result.xyz - 1.0, 0, 100), 1.0) * sampled; } \ No newline at end of file diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index dee1f1ca..290d699f 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -101,6 +101,7 @@ void DrawFinalPass::Draw(RenderScene& scene) } m_FinalPassFrameBuffer.Unbind(); GLERROR("DrawFinalPass::Draw: END"); + delete state; } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 57849d99..770baabf 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -101,7 +101,7 @@ void Renderer::Draw(RenderFrame& frame) GLERROR("Renderer::Draw m_DrawScenePass->Draw"); - m_TextPass->Draw(*scene); + m_TextPass->Draw(*scene, *m_DrawFinalPass->FinalPassFrameBuffer()); } m_DrawBloomPass->Draw(m_DrawFinalPass->BloomTexture()); diff --git a/src/Engine/Rendering/TextPass.cpp b/src/Engine/Rendering/TextPass.cpp index 6b05d7fb..1e3d5941 100644 --- a/src/Engine/Rendering/TextPass.cpp +++ b/src/Engine/Rendering/TextPass.cpp @@ -21,6 +21,8 @@ void TextPass::Initialize() m_TextProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/Text.vert.glsl"))); m_TextProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/Text.frag.glsl"))); m_TextProgram->Compile(); + m_TextProgram->BindFragDataLocation(0, "sceneColor"); + m_TextProgram->BindFragDataLocation(1, "bloomColor"); m_TextProgram->Link(); } @@ -29,8 +31,10 @@ void TextPass::Update() } -void TextPass::Draw(RenderScene& scene) +void TextPass::Draw(RenderScene& scene, FrameBuffer& frameBuffer) { + GLERROR("Derp1"); + TextPassState* state = new TextPassState(frameBuffer.GetHandle()); for (auto &job : scene.TextJobs) { auto textJob = std::dynamic_pointer_cast(job); if (textJob) { @@ -38,6 +42,8 @@ void TextPass::Draw(RenderScene& scene) renderText(textJob->Content, textJob->Resource, textJob->Alignment, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); } } + GLERROR("Derp2"); + delete state; } void TextPass::renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) @@ -61,10 +67,10 @@ void TextPass::renderText(std::string text, Font* font, TextJob::AlignmentEnum a penX = 0; } - TextPassState state; + m_TextProgram->Bind(); - glUniform3f(glGetUniformLocation(m_TextProgram->GetHandle(), "textColor"), color.x, color.y, color.z); + glUniform4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "textColor"), 1, glm::value_ptr(color)); glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); diff --git a/src/Engine/Rendering/TextPassState.cpp b/src/Engine/Rendering/TextPassState.cpp index e81f7b7c..d285a1f0 100644 --- a/src/Engine/Rendering/TextPassState.cpp +++ b/src/Engine/Rendering/TextPassState.cpp @@ -1,9 +1,9 @@ #include "Rendering/TextPassState.h" -TextPassState::TextPassState() +TextPassState::TextPassState(GLuint frameBuffer) { - BindFramebuffer(0); + BindFramebuffer(frameBuffer); glEnable(GL_BLEND); glDisable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST);