From f69545a4d7b1a785b19c856451c14dc8ff2dd755 Mon Sep 17 00:00:00 2001 From: Jonathas Costa Date: Thu, 15 Aug 2019 17:07:25 -0400 Subject: [PATCH] Added HDR bypass. --- .../openspace/rendering/framebufferrenderer.h | 2 ++ include/openspace/rendering/renderer.h | 1 + shaders/framebuffer/renderframebuffer.frag | 4 +++- src/rendering/framebufferrenderer.cpp | 24 +++++++++++++------ src/rendering/renderengine.cpp | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/include/openspace/rendering/framebufferrenderer.h b/include/openspace/rendering/framebufferrenderer.h index 39d8583971..a86fbe2d0e 100644 --- a/include/openspace/rendering/framebufferrenderer.h +++ b/include/openspace/rendering/framebufferrenderer.h @@ -138,6 +138,7 @@ public: void setSaturation(float sat) override; int nAaSamples() const override; + void disableHDR(bool disable) override; void update() override; void performRaycasterTasks(const std::vector& tasks); @@ -197,6 +198,7 @@ private: glm::ivec2 _resolution = glm::ivec2(0); int _nAaSamples; + bool _disableHDR = false; float _hdrExposure = 3.7f; float _gamma = 0.95f; diff --git a/include/openspace/rendering/renderer.h b/include/openspace/rendering/renderer.h index d8b40042b2..3520a02195 100644 --- a/include/openspace/rendering/renderer.h +++ b/include/openspace/rendering/renderer.h @@ -56,6 +56,7 @@ public: virtual void setValue(float value) = 0; virtual void setSaturation(float sat) = 0; virtual int nAaSamples() const = 0; + virtual void disableHDR(bool disable) = 0; /** * Set raycasting uniforms on the program object, and setup raycasting. diff --git a/shaders/framebuffer/renderframebuffer.frag b/shaders/framebuffer/renderframebuffer.frag index 3fb3a216ae..e7e18698b5 100644 --- a/shaders/framebuffer/renderframebuffer.frag +++ b/shaders/framebuffer/renderframebuffer.frag @@ -26,6 +26,7 @@ #include <#{fragmentPath}> #define exposure #{rendererData.hdrExposure} +#define disableHDRPipeline #{rendererData.disableHDR} #define DeltaError 0.013f #define MaxValueColorBuffer 1E10 @@ -37,7 +38,8 @@ layout(location = 3) out vec4 filterBuffer; void main() { Fragment f = getFragment(); - if (f.disableLDR2HDR) { + // Color is already in HDR space + if (f.disableLDR2HDR || (disableHDRPipeline == 1)) { _out_color_ = f.color; } else { _out_color_ = vec4((log2(vec3(1.0) - (f.color.rgb - vec3(DeltaError)))/(-exposure)), f.color.a); diff --git a/src/rendering/framebufferrenderer.cpp b/src/rendering/framebufferrenderer.cpp index cf5966a725..61f23be178 100644 --- a/src/rendering/framebufferrenderer.cpp +++ b/src/rendering/framebufferrenderer.cpp @@ -816,8 +816,13 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac glBindFramebuffer(GL_FRAMEBUFFER, _defaultFBO); glViewport(0, 0, _resolution.x, _resolution.y); - // Apply the selected TMO on the results and resolve the result for the default FBO - applyTMO(blackoutFactor); + if (_disableHDR) { + resolveMSAA(blackoutFactor); + } + else { + // Apply the selected TMO on the results and resolve the result for the default FBO + applyTMO(blackoutFactor); + } } void FramebufferRenderer::performRaycasterTasks(const std::vector& tasks) { @@ -1016,27 +1021,31 @@ void FramebufferRenderer::setNAaSamples(int nAaSamples) { _dirtyMsaaSamplingPattern = true; } +void FramebufferRenderer::disableHDR(bool disable) { + _disableHDR = std::move(disable); +} + void FramebufferRenderer::setHDRExposure(float hdrExposure) { ghoul_assert(hdrExposure > 0.f, "HDR exposure must be greater than zero"); - _hdrExposure = hdrExposure; + _hdrExposure = std::move(hdrExposure); updateRendererData(); } void FramebufferRenderer::setGamma(float gamma) { ghoul_assert(gamma > 0.f, "Gamma value must be greater than zero"); - _gamma = gamma; + _gamma = std::move(gamma); } void FramebufferRenderer::setHue(float hue) { - _hue = hue; + _hue = std::move(hue); } void FramebufferRenderer::setValue(float value) { - _value = value; + _value = std::move(value); } void FramebufferRenderer::setSaturation(float sat) { - _saturation = sat; + _saturation = std::move(sat); } int FramebufferRenderer::nAaSamples() const { @@ -1047,6 +1056,7 @@ void FramebufferRenderer::updateRendererData() { ghoul::Dictionary dict; dict.setValue("fragmentRendererPath", std::string(RenderFragmentShaderPath)); dict.setValue("hdrExposure", std::to_string(_hdrExposure)); + dict.setValue("disableHDR", std::to_string(_disableHDR)); _rendererData = dict; global::renderEngine.setRendererData(dict); } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 479e7b00f6..a0e7d11e3d 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -319,7 +319,7 @@ RenderEngine::RenderEngine() _disableHDRPipeline.onChange([this]() { if (_renderer) { - //_renderer->setHDRExposure(_hdrExposure); + _renderer->disableHDR(_disableHDRPipeline); } }); addProperty(_disableHDRPipeline);