From 34bfe8d419795c483160b777f586be6150e3f801 Mon Sep 17 00:00:00 2001 From: Anselme Date: Fri, 25 Aug 2017 17:24:38 +0200 Subject: [PATCH] added options to toggle gamma correct and HDR tonemapping from the debug GUI --- shaders/lighting.frag.glsl | 2 +- shaders/posteffects.frag.glsl | 6 +++-- shaders/posteffects.vert.glsl | 2 -- src/deferredpipeline.cpp | 41 ++++++++++++++++++++++++++++------- src/deferredpipeline.h | 6 ++++- 5 files changed, 43 insertions(+), 14 deletions(-) diff --git a/shaders/lighting.frag.glsl b/shaders/lighting.frag.glsl index 9db8fa0..048ed7d 100644 --- a/shaders/lighting.frag.glsl +++ b/shaders/lighting.frag.glsl @@ -90,7 +90,7 @@ vec3 GGX( mat3 viewToWorld = inverseViewMatrix; - vec3 irradiance = texture(ambientMap, viewToWorld*N).rgb; + vec3 irradiance = texture(ambientMap, viewToWorld * N).rgb; vec3 diffuse = irradiance * albedo; // sample both the pre-filter map and the BRDF lut and combine them together as per the Split-Sum approximation to get the IBL specular part. diff --git a/shaders/posteffects.frag.glsl b/shaders/posteffects.frag.glsl index f9e7c07..5429f81 100644 --- a/shaders/posteffects.frag.glsl +++ b/shaders/posteffects.frag.glsl @@ -1,5 +1,3 @@ -#version 330 core - // LIGHT BUFFER uniform sampler2DRect lightBuffer; @@ -15,10 +13,14 @@ void main(void) { vec3 color = texelFetch(lightBuffer, texCoord).xyz; // HDR tonemapping +#ifdef HDR_TONEMAPPING color = color / (color + vec3(1.0)); +#endif // gamma correct +#ifdef GAMMA_CORRECT color = pow(color, vec3(1.0/2.2)); +#endif outColor = vec4(color, 1.0); } diff --git a/shaders/posteffects.vert.glsl b/shaders/posteffects.vert.glsl index 9ef9406..9b165ed 100644 --- a/shaders/posteffects.vert.glsl +++ b/shaders/posteffects.vert.glsl @@ -1,5 +1,3 @@ -#version 330 core - layout(location = 0)in vec2 inPosition; void main(void) { diff --git a/src/deferredpipeline.cpp b/src/deferredpipeline.cpp index e1686cf..5f07f7f 100644 --- a/src/deferredpipeline.cpp +++ b/src/deferredpipeline.cpp @@ -90,11 +90,14 @@ DeferredPipeline::DeferredPipeline() : m_skybox(nullptr), m_width(512), m_height(512), + m_postEffectsShader(nullptr), m_depth_stencil_renderBuffer(0), m_gBuffer(nullptr), m_lightingBuffer(nullptr), m_renderTarget(nullptr), - m_debugGuiEnabled(false) + m_debugGuiEnabled(false), + m_gammaCorrectEnabled(true), + m_hdrTonemappingEnabled(false) { Resource::ResourceMap shaderMap; Resource::getResourcePack_shaders(shaderMap); @@ -107,15 +110,21 @@ DeferredPipeline::DeferredPipeline() : m_mesh2DSource = new ShaderSource(); m_mesh2DSource->setSource(shaderMap["shaders/gui.vert.glsl"], ShaderSource::VERTEX); m_mesh2DSource->setSource(shaderMap["shaders/gui.frag.glsl"], ShaderSource::FRAGMENT); - std::string vertSource = shaderMap["shaders/posteffects.vert.glsl"]; - std::string fragSource = shaderMap["shaders/posteffects.frag.glsl"]; - m_postEffectsShader = new Shader(vertSource, fragSource); + + m_postEffectsShaders = new ShaderSource(); + m_postEffectsShaders->setSource(shaderMap["shaders/posteffects.vert.glsl"], ShaderSource::VERTEX); + m_postEffectsShaders->setSource(shaderMap["shaders/posteffects.frag.glsl"], ShaderSource::FRAGMENT); + recompilePostEffectsShader(); + m_debugShaders = new ShaderSource(); - m_debugShaders->setSource(shaderMap["shaders/gui.vert.glsl"], ShaderSource::VERTEX); - m_debugShaders->setSource(shaderMap["shaders/gui.frag.glsl"], ShaderSource::FRAGMENT); + m_debugShaders->setSource(shaderMap["shaders/debug.vert.glsl"], ShaderSource::VERTEX); + m_debugShaders->setSource(shaderMap["shaders/debug.frag.glsl"], ShaderSource::FRAGMENT); + m_guiMesh = new GuiMesh(); m_guiMesh->initGL(); + + glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); } bool depthCompare(const GeometryNode* firstElem, const GeometryNode* secondElem) { @@ -259,8 +268,8 @@ void DeferredPipeline::renderGL(Scene *scene) node->mesh->draw(shader); } - //if(m_debugGuiEnabled) - // gui(); + if(m_debugGuiEnabled) + gui(); // IMGUI PASS m_guiMesh->drawGL(); @@ -316,6 +325,10 @@ struct DebugCanvas void DeferredPipeline::gui() { ImGui::Begin("Rendering Pipeline", &m_debugGuiEnabled); + if(ImGui::Checkbox("Gamma correction", &m_gammaCorrectEnabled)) + recompilePostEffectsShader(); + if(ImGui::Checkbox("HDR tonemapping", &m_hdrTonemappingEnabled)) + recompilePostEffectsShader(); if(ImGui::Button("Add a debug canvas")) { @@ -326,6 +339,18 @@ void DeferredPipeline::gui() } +void DeferredPipeline::recompilePostEffectsShader() +{ + std::vector defines; + if(m_gammaCorrectEnabled) + defines.push_back("GAMMA_CORRECT"); + if(m_hdrTonemappingEnabled) + defines.push_back("HDR_TONEMAPPING"); + if(m_postEffectsShader != nullptr) + delete m_postEffectsShader; + m_postEffectsShader = m_postEffectsShaders->compile(defines); +} + void DeferredPipeline::setSkybox(Texture* texture) { if(m_skybox != nullptr) diff --git a/src/deferredpipeline.h b/src/deferredpipeline.h index 5dc8753..c7554fc 100644 --- a/src/deferredpipeline.h +++ b/src/deferredpipeline.h @@ -44,11 +44,12 @@ class DeferredPipeline : public Pipeline std::unordered_map m_mesh3DShaders; std::unordered_map m_lightShaders; std::unordered_map m_mesh2DShaders; + Shader *m_postEffectsShader; ShaderSource *m_gBufferSource; ShaderSource *m_lightingSource; ShaderSource *m_mesh2DSource; - Shader *m_postEffectsShader; // TODELETE + ShaderSource *m_postEffectsShaders; ShaderSource *m_debugShaders; GuiMesh * m_guiMesh; @@ -61,8 +62,11 @@ class DeferredPipeline : public Pipeline // debug gui bool m_debugGuiEnabled; + bool m_gammaCorrectEnabled; + bool m_hdrTonemappingEnabled; void gui(); + void recompilePostEffectsShader(); public: DeferredPipeline();