diff --git a/interface/src/ui/Snapshot.cpp b/interface/src/ui/Snapshot.cpp index 926588e4ca..363e7a5cf1 100644 --- a/interface/src/ui/Snapshot.cpp +++ b/interface/src/ui/Snapshot.cpp @@ -41,7 +41,7 @@ #include "MainWindow.h" #include "Snapshot.h" #include "SnapshotUploader.h" -#include "ToneMappingEffect.h" +#include "ToneMapAndResampleTask.h" // filename format: hifi-snap-by-%username%-on-%date%_%time%_@-%location%.jpg // %1 <= username, %2 <= date and time, %3 <= current location diff --git a/libraries/render-utils/src/BloomEffect.cpp b/libraries/render-utils/src/BloomEffect.cpp index 523fbdbd2b..10df138fad 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -15,7 +15,7 @@ #include #include -#include +#include "ToneMapAndResampleTask.h" #include "render-utils/ShaderConstants.h" #define BLOOM_BLUR_LEVEL_COUNT 3 diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 8af3c81dfa..301288da38 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include "RenderHifi.h" #include "render-utils/ShaderConstants.h" @@ -51,7 +50,7 @@ #include "AmbientOcclusionEffect.h" #include "AntialiasingEffect.h" -#include "ToneMappingEffect.h" +#include "ToneMapAndResampleTask.h" #include "SubsurfaceScattering.h" #include "DrawHaze.h" #include "BloomEffect.h" @@ -239,8 +238,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("Bloom", bloomInputs); // Lighting Buffer ready for tone mapping - const auto toneMappingInputs = ToneMappingDeferred::Input(lightingFramebuffer, scaledPrimaryFramebuffer).asVarying(); - const auto toneMappedBuffer = task.addJob("ToneMapping", toneMappingInputs); + //TODO re-enable last 3 steps + //const auto toneMappingInputs = ToneMappingDeferred::Input(lightingFramebuffer, scaledPrimaryFramebuffer).asVarying(); + //const auto toneMappedBuffer = task.addJob("ToneMapping", toneMappingInputs); // Debugging task is happening in the "over" layer after tone mapping and just before HUD { // Debug the bounds of the rendered items, still look at the zbuffer diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index fb2222f98c..f7c62c9c8e 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -20,7 +20,7 @@ #include #include //#include -#include +//#include #include @@ -29,8 +29,8 @@ #include "StencilMaskPass.h" #include "ZoneRenderer.h" #include "FadeEffect.h" -#include "ToneMappingEffect.h" -//#include "ToneMapAndResampleTask.h" +//#include "ToneMappingEffect.h" +#include "ToneMapAndResampleTask.h" #include "BackgroundStage.h" #include "FramebufferCache.h" #include "TextureCache.h" @@ -167,8 +167,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend #endif // Upscale to finale resolution - //const auto primaryFramebuffer = task.addJob("ToneMapAndResample", toneMappedBuffer); - const auto primaryFramebuffer = task.addJob("ToneMapAndResample", toneMappedBuffer); + const auto primaryFramebuffer = task.addJob("ToneMapAndResample", toneMappedBuffer); // HUD Layer const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp new file mode 100644 index 0000000000..5fc331fab9 --- /dev/null +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -0,0 +1,109 @@ +// +// ResampleTask.cpp +// render/src/render +// +// Various to Resample or downsample textures into framebuffers. +// +// Created by Olivier Prat on 10/09/17. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "ToneMapAndResampleTask.h" + +#include +#include + +#include "render-utils/ShaderConstants.h" +#include "StencilMaskPass.h" +#include "FramebufferCache.h" + +using namespace render; +using namespace shader::gpu::program; +using namespace shader::render_utils::program; + +ToneMapAndResample::ToneMapAndResample() { + Parameters parameters; + _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); +} + +void ToneMapAndResample::setExposure(float exposure) { + auto& params = _parametersBuffer.get(); + if (params._exposure != exposure) { + _parametersBuffer.edit()._exposure = exposure; + _parametersBuffer.edit()._twoPowExposure = pow(2.0, exposure); + } +} + +void ToneMapAndResample::setToneCurve(ToneCurve curve) { + auto& params = _parametersBuffer.get(); + if (params._toneCurve != (int)curve) { + _parametersBuffer.edit()._toneCurve = (int)curve; + } +} + +void ToneMapAndResample::configure(const Config& config) { + setExposure(config.exposure); + setToneCurve((ToneCurve)config.curve); +} + +gpu::PipelinePointer ToneMapAndResample::_pipeline; +gpu::PipelinePointer ToneMapAndResample::_mirrorPipeline; + +void ToneMapAndResample::run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer) { + assert(renderContext->args); + assert(renderContext->args->hasViewFrustum()); + RenderArgs* args = renderContext->args; + auto sourceFramebuffer = input; + + //auto lightingBuffer = input->getRenderBuffer(0); + + resampledFrameBuffer = args->_blitFramebuffer; +/* + if (!_pipeline) { + init(args); + } + + if (!lightingBuffer || !blitFramebuffer) { + return; + } + */ + + if (resampledFrameBuffer != sourceFramebuffer) { + + if (!_pipeline) { + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + + state->setDepthTest(gpu::State::DepthTest(false, false)); + //blitState->setColorWriteMask(true, true, true, true); + + _pipeline = gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), state); + _mirrorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), state); + } + + const auto bufferSize = resampledFrameBuffer->getSize(); + + //auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); + + glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; + + gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) { + batch.enableStereo(false); + batch.setFramebuffer(resampledFrameBuffer); + + batch.setViewportTransform(viewport); + batch.setProjectionTransform(glm::mat4()); + batch.resetViewTransform(); + batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); + + // viewport = args->_viewport ?? + batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport)); + batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0)); + batch.draw(gpu::TRIANGLE_STRIP, 4); + }); + + // Set full final viewport + args->_viewport = viewport; + } +} \ No newline at end of file diff --git a/libraries/render/src/render/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h similarity index 91% rename from libraries/render/src/render/ToneMapAndResampleTask.h rename to libraries/render-utils/src/ToneMapAndResampleTask.h index 1365cabf71..6bf6fb3c85 100644 --- a/libraries/render/src/render/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -14,13 +14,18 @@ #ifndef hifi_render_ToneMapAndResampleTask_h #define hifi_render_ToneMapAndResampleTask_h -#include "Engine.h" +#include "render/Engine.h" -namespace render { +#include +#include +#include +#include + +//namespace render { enum class ToneCurve { // Different tone curve available - None, + None, Gamma22, Reinhard, Filmic, @@ -110,10 +115,10 @@ namespace render { using Output = gpu::FramebufferPointer; using Config = ToneMappingConfig; //using JobModel = render::Job::ModelIO; - using JobModel = Job::ModelIO; + using JobModel = render::Job::ModelIO; void configure(const Config& config); - void run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer); + void run(const render::RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer); protected: @@ -146,6 +151,6 @@ namespace render { void init(RenderArgs* args); }; -} +//} #endif // hifi_render_ResampleTask_h \ No newline at end of file diff --git a/libraries/render-utils/src/ToneMappingEffect.cpp b/libraries/render-utils/src/ToneMappingEffect.cpp deleted file mode 100644 index b7cc5d3d80..0000000000 --- a/libraries/render-utils/src/ToneMappingEffect.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// -// ToneMappingEffect.cpp -// libraries/render-utils/src -// -// Created by Sam Gateau on 12/7/2015. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "ToneMappingEffect.h" - -#include -#include - -#include "render-utils/ShaderConstants.h" -#include "StencilMaskPass.h" -#include "FramebufferCache.h" - - -ToneMappingEffect::ToneMappingEffect() { - Parameters parameters; - _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); -} - -void ToneMappingEffect::init(RenderArgs* args) { - auto blitProgram = gpu::Shader::createProgram(shader::render_utils::program::toneMapping); - - auto blitState = std::make_shared(); - blitState->setColorWriteMask(true, true, true, true); - _blitLightBuffer = gpu::PipelinePointer(gpu::Pipeline::create(blitProgram, blitState)); -} - -void ToneMappingEffect::setExposure(float exposure) { - auto& params = _parametersBuffer.get(); - if (params._exposure != exposure) { - _parametersBuffer.edit()._exposure = exposure; - _parametersBuffer.edit()._twoPowExposure = pow(2.0, exposure); - } -} - -void ToneMappingEffect::setToneCurve(ToneCurve curve) { - auto& params = _parametersBuffer.get(); - if (params._toneCurve != curve) { - _parametersBuffer.edit()._toneCurve = curve; - } -} - -void ToneMappingEffect::render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, const gpu::FramebufferPointer& destinationFramebuffer) { - if (!_blitLightBuffer) { - init(args); - } - - if (!lightingBuffer || !destinationFramebuffer) { - return; - } - - auto framebufferSize = glm::ivec2(lightingBuffer->getDimensions()); - gpu::doInBatch("ToneMappingEffect::render", args->_context, [&](gpu::Batch& batch) { - batch.enableStereo(false); - batch.setFramebuffer(destinationFramebuffer); - - // FIXME: Generate the Luminosity map - //batch.generateTextureMips(lightingBuffer); - - batch.setViewportTransform(args->_viewport); - batch.setProjectionTransform(glm::mat4()); - batch.resetViewTransform(); - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(framebufferSize, args->_viewport)); - batch.setPipeline(_blitLightBuffer); - - batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); - batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); -} - - -void ToneMappingDeferred::configure(const Config& config) { - _toneMappingEffect.setExposure(config.exposure); - _toneMappingEffect.setToneCurve((ToneMappingEffect::ToneCurve)config.curve); -} - -void ToneMappingDeferred::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) { - - auto lightingBuffer = input.get0()->getRenderBuffer(0); - auto destFbo = input.get1(); - - if (!destFbo) { - destFbo = renderContext->args->_blitFramebuffer; - } - - _toneMappingEffect.render(renderContext->args, lightingBuffer, destFbo); - output = destFbo; -} diff --git a/libraries/render-utils/src/ToneMappingEffect.h b/libraries/render-utils/src/ToneMappingEffect.h deleted file mode 100644 index faf6e514e9..0000000000 --- a/libraries/render-utils/src/ToneMappingEffect.h +++ /dev/null @@ -1,96 +0,0 @@ -// -// ToneMappingEffect.h -// libraries/render-utils/src -// -// Created by Sam Gateau on 12/7/2015. -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_ToneMappingEffect_h -#define hifi_ToneMappingEffect_h - -#include -#include - -#include -#include -#include -#include - - -class ToneMappingEffect { -public: - ToneMappingEffect(); - virtual ~ToneMappingEffect() {} - - void render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, const gpu::FramebufferPointer& destinationBuffer); - - void setExposure(float exposure); - float getExposure() const { return _parametersBuffer.get()._exposure; } - - // Different tone curve available - enum ToneCurve { - None = 0, - Gamma22, - Reinhard, - Filmic, - }; - void setToneCurve(ToneCurve curve); - ToneCurve getToneCurve() const { return (ToneCurve)_parametersBuffer.get()._toneCurve; } - -private: - - gpu::PipelinePointer _blitLightBuffer; - - // Class describing the uniform buffer with all the parameters common to the tone mapping shaders - class Parameters { - public: - float _exposure = 0.0f; - float _twoPowExposure = 1.0f; - glm::vec2 spareA; - int _toneCurve = Gamma22; - glm::vec3 spareB; - - Parameters() {} - }; - typedef gpu::BufferView UniformBufferView; - gpu::BufferView _parametersBuffer; - - void init(RenderArgs* args); -}; - -class ToneMappingConfig : public render::Job::Config { - Q_OBJECT - Q_PROPERTY(float exposure MEMBER exposure WRITE setExposure); - Q_PROPERTY(int curve MEMBER curve WRITE setCurve); -public: - ToneMappingConfig() : render::Job::Config(true) {} - - void setExposure(float newExposure) { exposure = newExposure; emit dirty(); } - void setCurve(int newCurve) { curve = std::max((int)ToneMappingEffect::None, std::min((int)ToneMappingEffect::Filmic, newCurve)); emit dirty(); } - - - float exposure{ 0.0f }; - int curve{ ToneMappingEffect::Gamma22 }; -signals: - void dirty(); -}; - -class ToneMappingDeferred { -public: - // Inputs: lightingFramebuffer, destinationFramebuffer - using Input = render::VaryingSet2; - using Output = gpu::FramebufferPointer; - using Config = ToneMappingConfig; - using JobModel = render::Job::ModelIO; - - void configure(const Config& config); - void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output); - - ToneMappingEffect _toneMappingEffect; -}; - -#endif // hifi_ToneMappingEffect_h diff --git a/libraries/render-utils/src/render-utils/toneMapping.slp b/libraries/render-utils/src/render-utils/toneMapping.slp index d4d8ec4b01..2bcb4497c4 100644 --- a/libraries/render-utils/src/render-utils/toneMapping.slp +++ b/libraries/render-utils/src/render-utils/toneMapping.slp @@ -1 +1,2 @@ VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord +DEFINES mirrored:f diff --git a/libraries/render-utils/src/toneMapping.slf b/libraries/render-utils/src/toneMapping.slf index 4f7ed6374d..e0d1d6f452 100644 --- a/libraries/render-utils/src/toneMapping.slf +++ b/libraries/render-utils/src/toneMapping.slf @@ -43,7 +43,11 @@ layout(location=0) in vec2 varTexCoord0; layout(location=0) out vec4 outFragColor; void main(void) { - vec4 fragColorRaw = texture(colorMap, varTexCoord0); + <@if HIFI_USE_MIRRORED@> + vec4 fragColorRaw = texture(colorMap, vec2(1.0 - varTexCoord0.x, varTexCoord0.y)); + <@else@> + vec4 fragColorRaw = texture(colorMap, varTexCoord0); + <@endif@> vec3 fragColor = fragColorRaw.xyz; vec3 srcColor = fragColor * getTwoPowExposure(); diff --git a/libraries/render/src/render/ToneMapAndResampleTask.cpp b/libraries/render/src/render/ToneMapAndResampleTask.cpp deleted file mode 100644 index b551aa14ce..0000000000 --- a/libraries/render/src/render/ToneMapAndResampleTask.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// -// ResampleTask.cpp -// render/src/render -// -// Various to Resample or downsample textures into framebuffers. -// -// Created by Olivier Prat on 10/09/17. -// Copyright 2017 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// -#include "ToneMapAndResampleTask.h" - -#include -#include - -using namespace render; -using namespace shader::gpu::program; -/* -gpu::PipelinePointer HalfDownsample::_pipeline; - -HalfDownsample::HalfDownsample() { - -} - -void HalfDownsample::configure(const Config& config) { - -} - -gpu::FramebufferPointer HalfDownsample::getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer) { - auto resampledFramebufferSize = sourceFramebuffer->getSize(); - - resampledFramebufferSize.x /= 2U; - resampledFramebufferSize.y /= 2U; - - if (!_destinationFrameBuffer || resampledFramebufferSize != _destinationFrameBuffer->getSize()) { - _destinationFrameBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("HalfOutput")); - - auto sampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT); - auto target = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), resampledFramebufferSize.x, resampledFramebufferSize.y, gpu::Texture::SINGLE_MIP, sampler); - _destinationFrameBuffer->setRenderBuffer(0, target); - } - return _destinationFrameBuffer; -} - -void HalfDownsample::run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer) { - assert(renderContext->args); - assert(renderContext->args->hasViewFrustum()); - RenderArgs* args = renderContext->args; - - resampledFrameBuffer = getResampledFrameBuffer(sourceFramebuffer); - - if (!_pipeline) { - gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::drawTransformUnitQuadTextureOpaque); - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - state->setDepthTest(gpu::State::DepthTest(false, false)); - _pipeline = gpu::Pipeline::create(program, state); - } - - const auto bufferSize = resampledFrameBuffer->getSize(); - glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; - - gpu::doInBatch("HalfDownsample::run", args->_context, [&](gpu::Batch& batch) { - batch.enableStereo(false); - - batch.setFramebuffer(resampledFrameBuffer); - - batch.setViewportTransform(viewport); - batch.setProjectionTransform(glm::mat4()); - batch.resetViewTransform(); - batch.setPipeline(_pipeline); - - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport)); - batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0)); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); -} -*/ -/* -gpu::PipelinePointer Resample::_pipeline; - -void Resample::configure(const Config& config) { - _factor = config.factor; -} - -gpu::FramebufferPointer Resample::getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer) { - if (_factor == 1.0f) { - return sourceFramebuffer; - } - - auto resampledFramebufferSize = glm::uvec2(glm::vec2(sourceFramebuffer->getSize()) * _factor); - - if (!_destinationFrameBuffer || resampledFramebufferSize != _destinationFrameBuffer->getSize()) { - _destinationFrameBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("ResampledOutput")); - - auto sampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); - auto target = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), resampledFramebufferSize.x, resampledFramebufferSize.y, gpu::Texture::SINGLE_MIP, sampler); - _destinationFrameBuffer->setRenderBuffer(0, target); - } - return _destinationFrameBuffer; -} - -void Resample::run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer) { - assert(renderContext->args); - assert(renderContext->args->hasViewFrustum()); - RenderArgs* args = renderContext->args; - - resampledFrameBuffer = getResampledFrameBuffer(sourceFramebuffer); - if (resampledFrameBuffer != sourceFramebuffer) { - if (!_pipeline) { - gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::drawTransformUnitQuadTextureOpaque); - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - state->setDepthTest(gpu::State::DepthTest(false, false)); - _pipeline = gpu::Pipeline::create(program, state); - } - - const auto bufferSize = resampledFrameBuffer->getSize(); - glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; - - gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) { - batch.enableStereo(false); - - batch.setFramebuffer(resampledFrameBuffer); - - batch.setViewportTransform(viewport); - batch.setProjectionTransform(glm::mat4()); - batch.resetViewTransform(); - batch.setPipeline(_pipeline); - - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport)); - batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0)); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); - - // Set full final viewport - args->_viewport = viewport; - } -} -*/ -ToneMapAndResample::ToneMapAndResample() { - Parameters parameters; - _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); -} - -void ToneMapAndResample::setExposure(float exposure) { - auto& params = _parametersBuffer.get(); - if (params._exposure != exposure) { - _parametersBuffer.edit()._exposure = exposure; - _parametersBuffer.edit()._twoPowExposure = pow(2.0, exposure); - } -} - -void ToneMapAndResample::setToneCurve(ToneCurve curve) { - auto& params = _parametersBuffer.get(); - if (params._toneCurve != (int)curve) { - _parametersBuffer.edit()._toneCurve = (int)curve; - } -} - -void ToneMapAndResample::configure(const Config& config) { - setExposure(config.exposure); - setToneCurve((ToneCurve)config.curve); -} - -gpu::PipelinePointer ToneMapAndResample::_pipeline; -gpu::PipelinePointer ToneMapAndResample::_mirrorPipeline; - -void ToneMapAndResample::run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer) { - assert(renderContext->args); - assert(renderContext->args->hasViewFrustum()); - RenderArgs* args = renderContext->args; - auto sourceFramebuffer = input; - - //auto lightingBuffer = input->getRenderBuffer(0); - - resampledFrameBuffer = args->_blitFramebuffer; -/* - if (!_pipeline) { - init(args); - } - - if (!lightingBuffer || !blitFramebuffer) { - return; - } - */ - - if (resampledFrameBuffer != sourceFramebuffer) { - - if (!_pipeline) { - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - - state->setDepthTest(gpu::State::DepthTest(false, false)); - //blitState->setColorWriteMask(true, true, true, true); - - _pipeline = gpu::Pipeline::create(gpu::Shader::createProgram(drawTransformUnitQuadTextureOpaque), state); - _mirrorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureMirroredX), state); - } - - const auto bufferSize = resampledFrameBuffer->getSize(); - - //auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); - - glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; - - gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) { - batch.enableStereo(false); - batch.setFramebuffer(resampledFrameBuffer); - - batch.setViewportTransform(viewport); - batch.setProjectionTransform(glm::mat4()); - batch.resetViewTransform(); - batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); - - // viewport = args->_viewport ?? - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(bufferSize, viewport)); - batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0)); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); - - // Set full final viewport - args->_viewport = viewport; - } -} \ No newline at end of file