From 24f022ec3b33a81ba11893fbed6c6075061ed1a0 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 3 Jul 2019 18:06:05 -0700 Subject: [PATCH 01/25] init commit for this pr, still buggy --- .../render-utils/src/RenderDeferredTask.cpp | 11 +- .../render-utils/src/RenderForwardTask.cpp | 11 +- .../src/ToneMapAndResampleTask.cpp | 139 ++++++++++++++++++ ...ppingEffect.h => ToneMapAndResampleTask.h} | 100 +++++++------ .../render-utils/src/ToneMappingEffect.cpp | 96 ------------ .../src/render-utils/toneMappingMirroredX.slp | 1 + .../render-utils/src/toneMappingMirroredX.slf | 71 +++++++++ 7 files changed, 272 insertions(+), 157 deletions(-) create mode 100644 libraries/render-utils/src/ToneMapAndResampleTask.cpp rename libraries/render-utils/src/{ToneMappingEffect.h => ToneMapAndResampleTask.h} (65%) delete mode 100644 libraries/render-utils/src/ToneMappingEffect.cpp create mode 100644 libraries/render-utils/src/render-utils/toneMappingMirroredX.slp create mode 100644 libraries/render-utils/src/toneMappingMirroredX.slf diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index c26f3b613c..cb7ef696ad 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -51,7 +51,7 @@ #include "AmbientOcclusionEffect.h" #include "AntialiasingEffect.h" -#include "ToneMappingEffect.h" +#include "ToneMapAndResampleTask.h" #include "SubsurfaceScattering.h" #include "DrawHaze.h" #include "BloomEffect.h" @@ -239,8 +239,8 @@ 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); + const auto toneMappingInputs = ToneMapAndResample::Input(lightingFramebuffer, scaledPrimaryFramebuffer).asVarying(); + const auto toneMappedBuffer = task.addJob("ToneMapAndResample", 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 @@ -250,11 +250,8 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("DebugRenderDeferredTask", debugInputs); } - // Upscale to finale resolution - const auto primaryFramebuffer = task.addJob("PrimaryBufferUpscale", toneMappedBuffer); - // HUD Layer - const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); + const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); } diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index b6b17ee376..0c13d2cfb8 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -28,7 +28,7 @@ #include "StencilMaskPass.h" #include "ZoneRenderer.h" #include "FadeEffect.h" -#include "ToneMappingEffect.h" +#include "ToneMapAndResampleTask.h" #include "BackgroundStage.h" #include "FramebufferCache.h" #include "TextureCache.h" @@ -159,16 +159,13 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // Lighting Buffer ready for tone mapping // Forward rendering on GLES doesn't support tonemapping to and from the same FBO, so we specify // the output FBO as null, which causes the tonemapping to target the blit framebuffer - const auto toneMappingInputs = ToneMappingDeferred::Input(resolvedFramebuffer, resolvedFramebuffer).asVarying(); - const auto toneMappedBuffer = task.addJob("ToneMapping", toneMappingInputs); + const auto toneMappingInputs = ToneMapAndResample::Input(resolvedFramebuffer, resolvedFramebuffer).asVarying(); + const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); #endif - // Upscale to finale resolution - const auto primaryFramebuffer = task.addJob("PrimaryBufferUpscale", toneMappedBuffer); - // HUD Layer - const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); + const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); } diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp new file mode 100644 index 0000000000..521c23685d --- /dev/null +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -0,0 +1,139 @@ +// +// ToneMapAndResampleTask.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 "ToneMapAndResampleTask.h" + +#include +#include + +#include "render-utils/ShaderConstants.h" +#include "StencilMaskPass.h" +#include "FramebufferCache.h" + +using namespace shader::render_utils::program; + +gpu::PipelinePointer ToneMapAndResample::_pipeline; +gpu::PipelinePointer ToneMapAndResample::_mirrorPipeline; + +ToneMapAndResample::ToneMapAndResample() { + Parameters parameters; + _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); +} + +void ToneMapAndResample::init(RenderArgs* args) { + + // shared_ptr to gpu::State + gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); + + // TODO why was this in the upsample task + //blitState->setDepthTest(gpu::State::DepthTest(false, false)); + blitState->setColorWriteMask(true, true, true, true); + + _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), blitState)); + _mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMappingMirroredX), blitState)); +} + +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; + } +} + +gpu::FramebufferPointer ToneMapAndResample::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; +} + +// TODO why was destination const +void ToneMapAndResample::render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, gpu::FramebufferPointer& destinationFramebuffer) { + + if (!_pipeline) { + init(args); + } + + if (!lightingBuffer || !destinationFramebuffer) { + return; + } + + //auto framebufferSize = glm::ivec2(lightingBuffer->getDimensions()); + + auto framebufferSize = destinationFramebuffer->getSize(); + + gpu::doInBatch("ToneMapAndResample::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(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); + + batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); + batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer); + batch.draw(gpu::TRIANGLE_STRIP, 4); + }); + + destinationFramebuffer = getResampledFrameBuffer(destinationFramebuffer); + + const auto bufferSize = destinationFramebuffer->getSize(); + glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; + + //Set full final viewport + args->_viewport = viewport; +} + +void ToneMapAndResample::configure(const Config& config) { + setExposure(config.exposure); + setToneCurve((ToneCurve)config.curve); +} + +void ToneMapAndResample::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) { + + assert(renderContext->args); + assert(renderContext->args->hasViewFrustum()); + + RenderArgs* args = renderContext->args; + + auto lightingBuffer = input.get0()->getRenderBuffer(0); + + auto resampledFramebuffer = args->_blitFramebuffer; + + render(args, lightingBuffer, resampledFramebuffer); + + output = resampledFramebuffer; +} + + diff --git a/libraries/render-utils/src/ToneMappingEffect.h b/libraries/render-utils/src/ToneMapAndResampleTask.h similarity index 65% rename from libraries/render-utils/src/ToneMappingEffect.h rename to libraries/render-utils/src/ToneMapAndResampleTask.h index faf6e514e9..439146e05f 100644 --- a/libraries/render-utils/src/ToneMappingEffect.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -1,5 +1,5 @@ // -// ToneMappingEffect.h +// ToneMapAndResample.h // libraries/render-utils/src // // Created by Sam Gateau on 12/7/2015. @@ -9,8 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_ToneMappingEffect_h -#define hifi_ToneMappingEffect_h +#ifndef hifi_ToneMapAndResample_h +#define hifi_ToneMapAndResample_h #include #include @@ -20,27 +20,64 @@ #include #include +enum class ToneCurve { + // Different tone curve available + None, + Gamma22, + Reinhard, + Filmic, +}; -class ToneMappingEffect { +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: - ToneMappingEffect(); - virtual ~ToneMappingEffect() {} + ToneMappingConfig() : render::Job::Config(true) {} - void render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, const gpu::FramebufferPointer& destinationBuffer); + void setExposure(float newExposure) { exposure = newExposure; emit dirty(); } + void setCurve(int newCurve) { curve = std::max((int)ToneCurve::None, std::min((int)ToneCurve::Filmic, newCurve)); emit dirty(); } + + + float exposure{ 0.0f }; + int curve{ (int)ToneCurve::Gamma22 }; +signals: + void dirty(); +}; + +class ToneMapAndResample { +public: + ToneMapAndResample(); + virtual ~ToneMapAndResample() {} + + void render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, 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; } + // 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); + +protected: + + static gpu::PipelinePointer _pipeline; + static gpu::PipelinePointer _mirrorPipeline; + + gpu::FramebufferPointer _destinationFrameBuffer; + + float _factor{ 2.0f }; + + gpu::FramebufferPointer ToneMapAndResample::getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); + private: gpu::PipelinePointer _blitLightBuffer; @@ -51,7 +88,7 @@ private: float _exposure = 0.0f; float _twoPowExposure = 1.0f; glm::vec2 spareA; - int _toneCurve = Gamma22; + int _toneCurve = (int)ToneCurve::Gamma22; glm::vec3 spareB; Parameters() {} @@ -62,35 +99,4 @@ private: 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 +#endif // hifi_ToneMapAndResample_h 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/render-utils/toneMappingMirroredX.slp b/libraries/render-utils/src/render-utils/toneMappingMirroredX.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/toneMappingMirroredX.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/toneMappingMirroredX.slf b/libraries/render-utils/src/toneMappingMirroredX.slf new file mode 100644 index 0000000000..7c510cdc1b --- /dev/null +++ b/libraries/render-utils/src/toneMappingMirroredX.slf @@ -0,0 +1,71 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on Sat Oct 24 09:34:37 2015 +// +// toneMapping.frag +// +// Draw texture 0 fetched at texcoord.xy +// +// Created by Sam Gateau on 6/22/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 render-utils/ShaderConstants.h@> + +struct ToneMappingParams { + vec4 _exp_2powExp_s0_s1; + ivec4 _toneCurve_s0_s1_s2; +}; + +const float GAMMA_22 = 2.2; +const float INV_GAMMA_22 = 1.0 / 2.2; +const int ToneCurveNone = 0; +const int ToneCurveGamma22 = 1; +const int ToneCurveReinhard = 2; +const int ToneCurveFilmic = 3; + +LAYOUT(binding=RENDER_UTILS_BUFFER_TM_PARAMS) uniform toneMappingParamsBuffer { + ToneMappingParams params; +}; +float getTwoPowExposure() { + return params._exp_2powExp_s0_s1.y; +} +int getToneCurve() { + return params._toneCurve_s0_s1_s2.x; +} + +LAYOUT(binding=RENDER_UTILS_TEXTURE_TM_COLOR) uniform sampler2D colorMap; + +layout(location=0) in vec2 varTexCoord0; +layout(location=0) out vec4 outFragColor; + +void main(void) { + vec4 fragColorRaw = texture(colorMap, vec2(1 - varTexCoord0.x, varTexCoord0.y)); + vec3 fragColor = fragColorRaw.xyz; + + vec3 srcColor = fragColor * getTwoPowExposure(); + + int toneCurve = getToneCurve(); + vec3 tonedColor = srcColor; + if (toneCurve == ToneCurveFilmic) { + vec3 x = max(vec3(0.0), srcColor-0.004); + tonedColor = pow((x * (6.2 * x + 0.5)) / (x * (6.2 * x + 1.7) + 0.06), vec3(GAMMA_22)); + } else if (toneCurve == ToneCurveReinhard) { + tonedColor = srcColor/(1.0 + srcColor); + } else if (toneCurve == ToneCurveGamma22) { + // We use glEnable(GL_FRAMEBUFFER_SRGB), which automatically converts textures from RGB to SRGB + // when writing from an RGB framebuffer to an SRGB framebuffer (note that it doesn't do anything + // when writing from an SRGB framebuffer to an RGB framebuffer). + // Since the conversion happens automatically, we don't need to do anything in this shader + } else { + // toneCurve == ToneCurveNone + // For debugging purposes, we may want to see what the colors look like before the automatic OpenGL + // conversion mentioned above, so we undo it here + tonedColor = pow(srcColor, vec3(GAMMA_22)); + } + + outFragColor = vec4(tonedColor, 1.0); +} From 0b51e3c129e6057e8aaaedd69c7f894c711746bd Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 9 Jul 2019 09:37:07 -0700 Subject: [PATCH 02/25] progress --- interface/src/ui/Snapshot.cpp | 2 +- libraries/render-utils/src/BloomEffect.cpp | 2 +- .../render-utils/src/RenderDeferredTask.cpp | 4 +-- .../render-utils/src/RenderForwardTask.cpp | 3 +- .../src/ToneMapAndResampleTask.cpp | 36 ++++++++++--------- 5 files changed, 24 insertions(+), 23 deletions(-) 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 414a1c3f91..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 cb7ef696ad..a4f1d6b6c9 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" @@ -246,7 +245,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren { // Debug the bounds of the rendered items, still look at the zbuffer const auto extraDebugBuffers = RenderDeferredTaskDebug::ExtraBuffers(linearDepthTarget, surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, ambientOcclusionUniforms, scatteringResource, velocityBuffer); const auto debugInputs = RenderDeferredTaskDebug::Input(fetchedItems, shadowTaskOutputs, lightingStageInputs, lightClusters, prepareDeferredOutputs, extraDebugBuffers, - deferredFrameTransform, jitter, lightingModel).asVarying(); + deferredFrameTransform, jitter, lightingModel).asVarying(); task.addJob("DebugRenderDeferredTask", debugInputs); } @@ -412,7 +411,6 @@ void RenderDeferredTaskDebug::build(JobModel& task, const render::Varying& input const auto debugZoneInputs = DebugZoneLighting::Inputs(deferredFrameTransform, lightFrame, backgroundFrame).asVarying(); task.addJob("DrawZoneStack", debugZoneInputs); - } diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 0c13d2cfb8..c16af23218 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #include @@ -100,6 +99,8 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // GPU jobs: Start preparing the main framebuffer const auto scaledPrimaryFramebuffer = task.addJob("PreparePrimaryBuffer"); + qDebug() << "anna forward " << "scaled " << renderContext->args->_viewport.z << " x " << renderContext->args->_viewport.w; + // Prepare deferred, generate the shared Deferred Frame Transform. Only valid with the scaled frame buffer const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index 521c23685d..474c56525a 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -34,7 +34,7 @@ void ToneMapAndResample::init(RenderArgs* args) { gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); // TODO why was this in the upsample task - //blitState->setDepthTest(gpu::State::DepthTest(false, false)); + blitState->setDepthTest(gpu::State::DepthTest(false, false)); blitState->setColorWriteMask(true, true, true, true); _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), blitState)); @@ -63,13 +63,16 @@ gpu::FramebufferPointer ToneMapAndResample::getResampledFrameBuffer(const gpu::F auto resampledFramebufferSize = glm::uvec2(glm::vec2(sourceFramebuffer->getSize()) * _factor); - if (!_destinationFrameBuffer || resampledFramebufferSize != _destinationFrameBuffer->getSize()) { - _destinationFrameBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("ResampledOutput")); + _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); + + auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format + auto primaryDepthTexture = gpu::Texture::createRenderBuffer(depthFormat, resampledFramebufferSize.x, resampledFramebufferSize.y, gpu::Texture::SINGLE_MIP, sampler); + _destinationFrameBuffer->setDepthStencilBuffer(primaryDepthTexture, depthFormat); - 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; } @@ -84,9 +87,11 @@ void ToneMapAndResample::render(RenderArgs* args, const gpu::TexturePointer& lig return; } - //auto framebufferSize = glm::ivec2(lightingBuffer->getDimensions()); + const auto destBufferSize = destinationFramebuffer->getSize(); - auto framebufferSize = destinationFramebuffer->getSize(); + auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); + + glm::ivec4 destViewport{ 0, 0, destBufferSize.x, destBufferSize.y }; gpu::doInBatch("ToneMapAndResample::render", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); @@ -95,10 +100,10 @@ void ToneMapAndResample::render(RenderArgs* args, const gpu::TexturePointer& lig // FIXME: Generate the Luminosity map //batch.generateTextureMips(lightingBuffer); - batch.setViewportTransform(args->_viewport); + batch.setViewportTransform(destViewport); batch.setProjectionTransform(glm::mat4()); batch.resetViewTransform(); - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(framebufferSize, args->_viewport)); + batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(srcBufferSize, args->_viewport)); batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); @@ -106,13 +111,10 @@ void ToneMapAndResample::render(RenderArgs* args, const gpu::TexturePointer& lig batch.draw(gpu::TRIANGLE_STRIP, 4); }); - destinationFramebuffer = getResampledFrameBuffer(destinationFramebuffer); + //Set full final viewport + args->_viewport = destViewport; - const auto bufferSize = destinationFramebuffer->getSize(); - glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; - - //Set full final viewport - args->_viewport = viewport; + // TODO access violation reading 0xFFFFFFFFFFFFFFFF } void ToneMapAndResample::configure(const Config& config) { From b59d967b6c2a8a50662e26cadb7f9cc16513dbf3 Mon Sep 17 00:00:00 2001 From: Anna Date: Thu, 11 Jul 2019 16:44:56 -0700 Subject: [PATCH 03/25] fixed luci, made tone mapping mirrored auto generate, changed color format on forward, bug fixes --- libraries/render-utils/src/BloomEffect.cpp | 3 +- .../src/DeferredLightingEffect.cpp | 8 ++ .../render-utils/src/RenderDeferredTask.cpp | 7 +- .../render-utils/src/RenderForwardTask.cpp | 17 ++- .../render-utils/src/RenderForwardTask.h | 2 + .../src/ToneMapAndResampleTask.cpp | 105 +++++++----------- .../render-utils/src/ToneMapAndResampleTask.h | 2 +- .../src/render-utils/toneMapping.slp | 1 + libraries/render-utils/src/toneMapping.slf | 4 + .../utilities/render/deferredLighting.qml | 2 +- 10 files changed, 69 insertions(+), 82 deletions(-) diff --git a/libraries/render-utils/src/BloomEffect.cpp b/libraries/render-utils/src/BloomEffect.cpp index 10df138fad..a069aa60fa 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -60,7 +60,8 @@ void BloomThreshold::run(const render::RenderContextPointer& renderContext, cons auto colorTexture = gpu::TexturePointer(gpu::Texture::createRenderBuffer(inputBuffer->getTexelFormat(), bufferSize.x, bufferSize.y, gpu::Texture::SINGLE_MIP, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT, gpu::Sampler::WRAP_CLAMP))); - _outputBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("BloomThreshold")); + //_outputBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("BloomThreshold")); + _outputBuffer = args->_blitFramebuffer; _outputBuffer->setRenderBuffer(0, colorTexture); _parameters.edit()._deltaUV = { 1.0f / bufferSize.x, 1.0f / bufferSize.y }; diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 3b7c66d42d..88b9f09161 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -29,6 +29,10 @@ #include "TextureCache.h" #include "FramebufferCache.h" +#include +#include +#include + namespace ru { using render_utils::slot::texture::Texture; using render_utils::slot::buffer::Buffer; @@ -284,6 +288,10 @@ void PrepareDeferred::run(const RenderContextPointer& renderContext, const Input } _deferredFramebuffer->updatePrimaryDepth(primaryFramebuffer->getDepthStencilBuffer()); + auto dummy = _deferredFramebuffer->getFrameSize(); + auto height = _deferredFramebuffer->getLightingFramebuffer()->getHeight(); + auto width = _deferredFramebuffer->getLightingFramebuffer()->getWidth(); + outputs.edit0() = _deferredFramebuffer; outputs.edit1() = _deferredFramebuffer->getLightingFramebuffer(); diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index a4f1d6b6c9..eafc2463f5 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -95,7 +95,7 @@ RenderDeferredTask::RenderDeferredTask() void RenderDeferredTask::configure(const Config& config) { // Propagate resolution scale to sub jobs who need it - auto preparePrimaryBufferConfig = config.getConfig("PreparePrimaryBuffer"); + auto preparePrimaryBufferConfig = config.getConfig("PreparePrimaryBufferDeferred"); assert(preparePrimaryBufferConfig); preparePrimaryBufferConfig->setResolutionScale(config.resolutionScale); } @@ -145,7 +145,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto jitter = task.addJob("JitterCam"); // GPU jobs: Start preparing the primary, deferred and lighting buffer - const auto scaledPrimaryFramebuffer = task.addJob("PreparePrimaryBuffer"); + const auto scaledPrimaryFramebuffer = task.addJob("PreparePrimaryBufferDeferred"); // Prepare deferred, generate the shared Deferred Frame Transform. Only valid with the scaled frame buffer const auto deferredFrameTransform = task.addJob("DeferredFrameTransform", jitter); @@ -238,7 +238,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("Bloom", bloomInputs); // Lighting Buffer ready for tone mapping - const auto toneMappingInputs = ToneMapAndResample::Input(lightingFramebuffer, scaledPrimaryFramebuffer).asVarying(); + const auto toneMappingInputs = lightingFramebuffer; const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); // Debugging task is happening in the "over" layer after tone mapping and just before HUD @@ -252,6 +252,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // HUD Layer const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); + } RenderDeferredTaskDebug::RenderDeferredTaskDebug() { diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index c16af23218..2c8a2b498d 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -34,6 +34,8 @@ #include "RenderCommonTask.h" #include "RenderHUDLayerTask.h" +#include + namespace ru { using render_utils::slot::texture::Texture; using render_utils::slot::buffer::Buffer; @@ -50,7 +52,7 @@ extern void initForwardPipelines(ShapePlumber& plumber); void RenderForwardTask::configure(const Config& config) { // Propagate resolution scale to sub jobs who need it - auto preparePrimaryBufferConfig = config.getConfig("PreparePrimaryBuffer"); + auto preparePrimaryBufferConfig = config.getConfig("PreparePrimaryBufferForward"); assert(preparePrimaryBufferConfig); preparePrimaryBufferConfig->setResolutionScale(config.resolutionScale); } @@ -98,9 +100,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // GPU jobs: Start preparing the main framebuffer - const auto scaledPrimaryFramebuffer = task.addJob("PreparePrimaryBuffer"); - qDebug() << "anna forward " << "scaled " << renderContext->args->_viewport.z << " x " << renderContext->args->_viewport.w; - + const auto scaledPrimaryFramebuffer = task.addJob("PreparePrimaryBufferForward"); // Prepare deferred, generate the shared Deferred Frame Transform. Only valid with the scaled frame buffer const auto deferredFrameTransform = task.addJob("DeferredFrameTransform"); @@ -152,15 +152,11 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend #else const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); - - // Just resolve the msaa const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); // Lighting Buffer ready for tone mapping - // Forward rendering on GLES doesn't support tonemapping to and from the same FBO, so we specify - // the output FBO as null, which causes the tonemapping to target the blit framebuffer - const auto toneMappingInputs = ToneMapAndResample::Input(resolvedFramebuffer, resolvedFramebuffer).asVarying(); + const auto toneMappingInputs = resolvedFramebuffer; const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); #endif @@ -175,7 +171,8 @@ gpu::FramebufferPointer PreparePrimaryFramebufferMSAA::createFramebuffer(const c auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); - auto colorFormat = gpu::Element::COLOR_SRGBA_32; + //auto colorFormat = gpu::Element::COLOR_SRGBA_32; + auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); auto colorTexture = gpu::Texture::createRenderBufferMultisample(colorFormat, frameSize.x, frameSize.y, numSamples, defaultSampler); framebuffer->setRenderBuffer(0, colorTexture); diff --git a/libraries/render-utils/src/RenderForwardTask.h b/libraries/render-utils/src/RenderForwardTask.h index 2abf248692..dd0abbc9ab 100755 --- a/libraries/render-utils/src/RenderForwardTask.h +++ b/libraries/render-utils/src/RenderForwardTask.h @@ -50,11 +50,13 @@ public: const float SCALE_RANGE_MIN = 0.1f; const float SCALE_RANGE_MAX = 2.0f; resolutionScale = std::max(SCALE_RANGE_MIN, std::min(SCALE_RANGE_MAX, scale)); + //emit dirty(); } int getNumSamples() const { return numSamples; } void setNumSamples(int num) { numSamples = std::max(1, std::min(32, num)); + emit dirty(); } signals: diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index 474c56525a..5f3e643a69 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -38,7 +38,7 @@ void ToneMapAndResample::init(RenderArgs* args) { blitState->setColorWriteMask(true, true, true, true); _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), blitState)); - _mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMappingMirroredX), blitState)); + _mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), blitState)); } void ToneMapAndResample::setExposure(float exposure) { @@ -56,67 +56,6 @@ void ToneMapAndResample::setToneCurve(ToneCurve curve) { } } -gpu::FramebufferPointer ToneMapAndResample::getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer) { - if (_factor == 1.0f) { - return sourceFramebuffer; - } - - auto resampledFramebufferSize = glm::uvec2(glm::vec2(sourceFramebuffer->getSize()) * _factor); - - _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); - - auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format - auto primaryDepthTexture = gpu::Texture::createRenderBuffer(depthFormat, resampledFramebufferSize.x, resampledFramebufferSize.y, gpu::Texture::SINGLE_MIP, sampler); - _destinationFrameBuffer->setDepthStencilBuffer(primaryDepthTexture, depthFormat); - - return _destinationFrameBuffer; -} - -// TODO why was destination const -void ToneMapAndResample::render(RenderArgs* args, const gpu::TexturePointer& lightingBuffer, gpu::FramebufferPointer& destinationFramebuffer) { - - if (!_pipeline) { - init(args); - } - - if (!lightingBuffer || !destinationFramebuffer) { - return; - } - - const auto destBufferSize = destinationFramebuffer->getSize(); - - auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); - - glm::ivec4 destViewport{ 0, 0, destBufferSize.x, destBufferSize.y }; - - gpu::doInBatch("ToneMapAndResample::render", args->_context, [&](gpu::Batch& batch) { - batch.enableStereo(false); - batch.setFramebuffer(destinationFramebuffer); - - // FIXME: Generate the Luminosity map - //batch.generateTextureMips(lightingBuffer); - - batch.setViewportTransform(destViewport); - batch.setProjectionTransform(glm::mat4()); - batch.resetViewTransform(); - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(srcBufferSize, args->_viewport)); - batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); - - batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); - batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); - - //Set full final viewport - args->_viewport = destViewport; - - // TODO access violation reading 0xFFFFFFFFFFFFFFFF -} - void ToneMapAndResample::configure(const Config& config) { setExposure(config.exposure); setToneCurve((ToneCurve)config.curve); @@ -129,13 +68,47 @@ void ToneMapAndResample::run(const render::RenderContextPointer& renderContext, RenderArgs* args = renderContext->args; - auto lightingBuffer = input.get0()->getRenderBuffer(0); + auto lightingBuffer = input->getRenderBuffer(0); - auto resampledFramebuffer = args->_blitFramebuffer; + auto blitFramebuffer = args->_blitFramebuffer; - render(args, lightingBuffer, resampledFramebuffer); + if (!_pipeline) { + init(args); + } - output = resampledFramebuffer; + if (!lightingBuffer || !blitFramebuffer) { + return; + } + + const auto blitBufferSize = blitFramebuffer->getSize(); + + auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); + + glm::ivec4 destViewport{ 0, 0, blitBufferSize.x, blitBufferSize.y }; + + gpu::doInBatch("ToneMapAndResample::render", args->_context, [&](gpu::Batch& batch) { + batch.enableStereo(false); + batch.setFramebuffer(blitFramebuffer); + + // FIXME: Generate the Luminosity map + //batch.generateTextureMips(lightingBuffer); + + batch.setViewportTransform(destViewport); + batch.setProjectionTransform(glm::mat4()); + batch.resetViewTransform(); + batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(srcBufferSize, args->_viewport)); + + batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); + + batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); + batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer); + batch.draw(gpu::TRIANGLE_STRIP, 4); + }); + + //Set full final viewport + args->_viewport = destViewport; + + output = blitFramebuffer; } diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h index 439146e05f..e9e95534b7 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -59,7 +59,7 @@ public: ToneCurve getToneCurve() const { return (ToneCurve)_parametersBuffer.get()._toneCurve; } // Inputs: lightingFramebuffer, destinationFramebuffer - using Input = render::VaryingSet2; + using Input = gpu::FramebufferPointer; using Output = gpu::FramebufferPointer; using Config = ToneMappingConfig; using JobModel = render::Job::ModelIO; diff --git a/libraries/render-utils/src/render-utils/toneMapping.slp b/libraries/render-utils/src/render-utils/toneMapping.slp index d4d8ec4b01..614df45551 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 \ No newline at end of file diff --git a/libraries/render-utils/src/toneMapping.slf b/libraries/render-utils/src/toneMapping.slf index 4f7ed6374d..6de12b3a23 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) { +<@if HIFI_USE_MIRROREDX@> + 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/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index 80ca8b09e1..f2891ddc55 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -45,7 +45,7 @@ Rectangle { anchors.right: parent.right spacing: 5 Repeater { - model: [ "MSAA:PrepareFramebuffer:numSamples:4:1" + model: [ "MSAA:PreparePrimaryBufferForward:numSamples:4:1" ] ConfigSlider { label: qsTr(modelData.split(":")[0]) From e129f887234026e06ab107f0f269eca52091e472 Mon Sep 17 00:00:00 2001 From: Anna Date: Thu, 11 Jul 2019 17:10:08 -0700 Subject: [PATCH 04/25] deleted tone mapping mirrored slf and slp since they auto generate --- .../src/ToneMapAndResampleTask.cpp | 1 - .../src/render-utils/toneMappingMirroredX.slp | 1 - .../render-utils/src/toneMappingMirroredX.slf | 71 ------------------- 3 files changed, 73 deletions(-) delete mode 100644 libraries/render-utils/src/render-utils/toneMappingMirroredX.slp delete mode 100644 libraries/render-utils/src/toneMappingMirroredX.slf diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index 5f3e643a69..b6079ef0a7 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -33,7 +33,6 @@ void ToneMapAndResample::init(RenderArgs* args) { // shared_ptr to gpu::State gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); - // TODO why was this in the upsample task blitState->setDepthTest(gpu::State::DepthTest(false, false)); blitState->setColorWriteMask(true, true, true, true); diff --git a/libraries/render-utils/src/render-utils/toneMappingMirroredX.slp b/libraries/render-utils/src/render-utils/toneMappingMirroredX.slp deleted file mode 100644 index d4d8ec4b01..0000000000 --- a/libraries/render-utils/src/render-utils/toneMappingMirroredX.slp +++ /dev/null @@ -1 +0,0 @@ -VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/toneMappingMirroredX.slf b/libraries/render-utils/src/toneMappingMirroredX.slf deleted file mode 100644 index 7c510cdc1b..0000000000 --- a/libraries/render-utils/src/toneMappingMirroredX.slf +++ /dev/null @@ -1,71 +0,0 @@ -<@include gpu/Config.slh@> -<$VERSION_HEADER$> -// Generated on Sat Oct 24 09:34:37 2015 -// -// toneMapping.frag -// -// Draw texture 0 fetched at texcoord.xy -// -// Created by Sam Gateau on 6/22/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 render-utils/ShaderConstants.h@> - -struct ToneMappingParams { - vec4 _exp_2powExp_s0_s1; - ivec4 _toneCurve_s0_s1_s2; -}; - -const float GAMMA_22 = 2.2; -const float INV_GAMMA_22 = 1.0 / 2.2; -const int ToneCurveNone = 0; -const int ToneCurveGamma22 = 1; -const int ToneCurveReinhard = 2; -const int ToneCurveFilmic = 3; - -LAYOUT(binding=RENDER_UTILS_BUFFER_TM_PARAMS) uniform toneMappingParamsBuffer { - ToneMappingParams params; -}; -float getTwoPowExposure() { - return params._exp_2powExp_s0_s1.y; -} -int getToneCurve() { - return params._toneCurve_s0_s1_s2.x; -} - -LAYOUT(binding=RENDER_UTILS_TEXTURE_TM_COLOR) uniform sampler2D colorMap; - -layout(location=0) in vec2 varTexCoord0; -layout(location=0) out vec4 outFragColor; - -void main(void) { - vec4 fragColorRaw = texture(colorMap, vec2(1 - varTexCoord0.x, varTexCoord0.y)); - vec3 fragColor = fragColorRaw.xyz; - - vec3 srcColor = fragColor * getTwoPowExposure(); - - int toneCurve = getToneCurve(); - vec3 tonedColor = srcColor; - if (toneCurve == ToneCurveFilmic) { - vec3 x = max(vec3(0.0), srcColor-0.004); - tonedColor = pow((x * (6.2 * x + 0.5)) / (x * (6.2 * x + 1.7) + 0.06), vec3(GAMMA_22)); - } else if (toneCurve == ToneCurveReinhard) { - tonedColor = srcColor/(1.0 + srcColor); - } else if (toneCurve == ToneCurveGamma22) { - // We use glEnable(GL_FRAMEBUFFER_SRGB), which automatically converts textures from RGB to SRGB - // when writing from an RGB framebuffer to an SRGB framebuffer (note that it doesn't do anything - // when writing from an SRGB framebuffer to an RGB framebuffer). - // Since the conversion happens automatically, we don't need to do anything in this shader - } else { - // toneCurve == ToneCurveNone - // For debugging purposes, we may want to see what the colors look like before the automatic OpenGL - // conversion mentioned above, so we undo it here - tonedColor = pow(srcColor, vec3(GAMMA_22)); - } - - outFragColor = vec4(tonedColor, 1.0); -} From 8d9760ae0c05e2634ed5e2b3ba7ddb9305798ad2 Mon Sep 17 00:00:00 2001 From: Anna Date: Fri, 12 Jul 2019 09:19:03 -0700 Subject: [PATCH 05/25] typo fix --- libraries/render-utils/src/ToneMapAndResampleTask.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h index e9e95534b7..ba7ca260d9 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -76,7 +76,7 @@ protected: float _factor{ 2.0f }; - gpu::FramebufferPointer ToneMapAndResample::getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); + gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); private: From 2cd2e357360ba6f994c77b3f3bba5f0dea59dc74 Mon Sep 17 00:00:00 2001 From: Anna Date: Fri, 12 Jul 2019 14:38:00 -0700 Subject: [PATCH 06/25] fixing jenkins build errors --- libraries/render-utils/src/DeferredLightingEffect.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 88b9f09161..c7cb90e7e2 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -29,7 +29,6 @@ #include "TextureCache.h" #include "FramebufferCache.h" -#include #include #include From 58a04c1ccfed2c3e06148fa680b4057e35b71d83 Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 16 Jul 2019 09:47:30 -0700 Subject: [PATCH 07/25] fix jenkins errors for real this time --- libraries/render-utils/src/RenderForwardTask.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 2c8a2b498d..cd57fae7bf 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -34,8 +34,6 @@ #include "RenderCommonTask.h" #include "RenderHUDLayerTask.h" -#include - namespace ru { using render_utils::slot::texture::Texture; using render_utils::slot::buffer::Buffer; From 45d1672edd30d9d544cef0b7fe6da3a80c90371b Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 16 Jul 2019 14:38:36 -0700 Subject: [PATCH 08/25] remove testing variables --- libraries/render-utils/src/DeferredLightingEffect.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index c7cb90e7e2..d042a8305b 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -287,10 +287,6 @@ void PrepareDeferred::run(const RenderContextPointer& renderContext, const Input } _deferredFramebuffer->updatePrimaryDepth(primaryFramebuffer->getDepthStencilBuffer()); - auto dummy = _deferredFramebuffer->getFrameSize(); - auto height = _deferredFramebuffer->getLightingFramebuffer()->getHeight(); - auto width = _deferredFramebuffer->getLightingFramebuffer()->getWidth(); - outputs.edit0() = _deferredFramebuffer; outputs.edit1() = _deferredFramebuffer->getLightingFramebuffer(); From ca24693f39f6871d45196521d20d0941ad066a04 Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 23 Jul 2019 16:03:20 -0700 Subject: [PATCH 09/25] applying android crash fix for testing purposes --- .../src/platform/backend/PlatformInstance.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/platform/src/platform/backend/PlatformInstance.cpp b/libraries/platform/src/platform/backend/PlatformInstance.cpp index 038521d398..2f68972c4a 100644 --- a/libraries/platform/src/platform/backend/PlatformInstance.cpp +++ b/libraries/platform/src/platform/backend/PlatformInstance.cpp @@ -104,34 +104,34 @@ void Instance::enumerateNics() { } } } - json Instance::getCPU(int index) { - assert(index <(int) _cpus.size()); - if (index >= (int)_cpus.size()) + assert(index < (int)_cpus.size()); + + if (index < 0 || (int)_cpus.size() <= index) return json(); return _cpus.at(index); } json Instance::getGPU(int index) { - assert(index <(int) _gpus.size()); + assert(index < (int)_gpus.size()); - if (index >=(int) _gpus.size()) + if (index < 0 || (int)_gpus.size() <= index) return json(); - + return _gpus.at(index); } - json Instance::getDisplay(int index) { - assert(index <(int) _displays.size()); - - if (index >=(int) _displays.size()) + assert(index < (int)_displays.size()); + + if (index < 0 || (int)_displays.size() <= index) return json(); return _displays.at(index); } + Instance::~Instance() { if (_cpus.size() > 0) { _cpus.clear(); From 27586727db5a70b461ae3bb4f603f7020f62e6a9 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 24 Jul 2019 11:38:47 -0700 Subject: [PATCH 10/25] make tonemapandresampletask run on android --- libraries/render-utils/src/RenderForwardTask.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index cd57fae7bf..367224f937 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -153,12 +153,12 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); +#endif + // Lighting Buffer ready for tone mapping const auto toneMappingInputs = resolvedFramebuffer; const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); -#endif - // HUD Layer const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); From 1b0d8ee60366ab4b6fd7115d23ca8d9c512b61f1 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 24 Jul 2019 13:37:33 -0700 Subject: [PATCH 11/25] removed typo --- libraries/render-utils/src/RenderForwardTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 367224f937..0d25763613 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -146,7 +146,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast(nullptr)).asVarying(); const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); - const auto toneMappedBuffer = resolvedFramebuffer; + //const auto toneMappedBuffer = resolvedFramebuffer; #else const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); From 635ed89d456dae6238285672b4f72ad3235a1e2d Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 24 Jul 2019 17:05:59 -0700 Subject: [PATCH 12/25] fixed cmake --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e4746418d..f8fd5b7637 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ endif() include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake") target_python() -if (WIN32) +if (WIN32 AND NOT HIFI_ANDROID) # Force x64 toolset set(CMAKE_GENERATOR_TOOLSET "host=x64" CACHE STRING "64-bit toolset" FORCE) endif() From 16595d9412da005364fa76a7e548703274e5109c Mon Sep 17 00:00:00 2001 From: Anna Date: Fri, 26 Jul 2019 11:56:25 -0700 Subject: [PATCH 13/25] created tonemapandresample --- libraries/render-utils/src/BloomEffect.cpp | 2 +- .../render-utils/src/RenderDeferredTask.cpp | 8 +- .../render-utils/src/RenderForwardTask.cpp | 7 +- .../src/render/ToneMapAndResampleTask.cpp | 180 ++++++++++++++++++ .../src/render/ToneMapAndResampleTask.h | 87 +++++++++ 5 files changed, 277 insertions(+), 7 deletions(-) create mode 100644 libraries/render/src/render/ToneMapAndResampleTask.cpp create mode 100644 libraries/render/src/render/ToneMapAndResampleTask.h diff --git a/libraries/render-utils/src/BloomEffect.cpp b/libraries/render-utils/src/BloomEffect.cpp index 414a1c3f91..523fbdbd2b 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -15,7 +15,7 @@ #include #include -#include +#include #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 c26f3b613c..8af3c81dfa 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include "RenderHifi.h" #include "render-utils/ShaderConstants.h" @@ -251,11 +251,11 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren } // Upscale to finale resolution - const auto primaryFramebuffer = task.addJob("PrimaryBufferUpscale", toneMappedBuffer); + //const auto primaryFramebuffer = task.addJob("PrimaryBufferUpscale", toneMappedBuffer); // HUD Layer - const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); - task.addJob("RenderHUDLayer", renderHUDLayerInputs); + //const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); + //task.addJob("RenderHUDLayer", renderHUDLayerInputs); } RenderDeferredTaskDebug::RenderDeferredTaskDebug() { diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index b6b17ee376..0e3f036e6b 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -19,7 +19,8 @@ #include #include #include -#include +//#include +#include #include @@ -29,6 +30,7 @@ #include "ZoneRenderer.h" #include "FadeEffect.h" #include "ToneMappingEffect.h" +//#include "ToneMapAndResampleTask.h" #include "BackgroundStage.h" #include "FramebufferCache.h" #include "TextureCache.h" @@ -165,7 +167,8 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend #endif // Upscale to finale resolution - const auto primaryFramebuffer = task.addJob("PrimaryBufferUpscale", 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/src/render/ToneMapAndResampleTask.cpp b/libraries/render/src/render/ToneMapAndResampleTask.cpp new file mode 100644 index 0000000000..c304f12f4a --- /dev/null +++ b/libraries/render/src/render/ToneMapAndResampleTask.cpp @@ -0,0 +1,180 @@ +// +// 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; + } +} + +gpu::PipelinePointer ResampleToBlitFramebuffer::_pipeline; +gpu::PipelinePointer ResampleToBlitFramebuffer::_mirrorPipeline; + +void ResampleToBlitFramebuffer::run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer) { + assert(renderContext->args); + assert(renderContext->args->hasViewFrustum()); + RenderArgs* args = renderContext->args; + auto sourceFramebuffer = input; + + resampledFrameBuffer = args->_blitFramebuffer; + + if (resampledFrameBuffer != sourceFramebuffer) { + if (!_pipeline) { + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + state->setDepthTest(gpu::State::DepthTest(false, false)); + + _pipeline = gpu::Pipeline::create(gpu::Shader::createProgram(drawTransformUnitQuadTextureOpaque), state); + _mirrorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureMirroredX), 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(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _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; + } +} \ No newline at end of file diff --git a/libraries/render/src/render/ToneMapAndResampleTask.h b/libraries/render/src/render/ToneMapAndResampleTask.h new file mode 100644 index 0000000000..f900bf85fa --- /dev/null +++ b/libraries/render/src/render/ToneMapAndResampleTask.h @@ -0,0 +1,87 @@ +// +// ResampleTask.h +// render/src/render +// +// Various to upsample 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 +// + +#ifndef hifi_render_ToneMapAndResampleTask_h +#define hifi_render_ToneMapAndResampleTask_h + +#include "Engine.h" + +namespace render { +/* + class HalfDownsample { + public: + using Config = JobConfig; + using JobModel = Job::ModelIO; + + HalfDownsample(); + + void configure(const Config& config); + void run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer); + + protected: + + static gpu::PipelinePointer _pipeline; + + gpu::FramebufferPointer _destinationFrameBuffer; + + gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); + }; +*/ + class ResampleConfig : public render::Job::Config { + Q_OBJECT + Q_PROPERTY(float factor MEMBER factor NOTIFY dirty) + public: + + float factor{ 1.0f }; + + signals: + void dirty(); + }; + + class Resample { + public: + using Config = ResampleConfig; + using JobModel = Job::ModelIO; + + Resample(float factor = 2.0f) : _factor{ factor } {} + + void configure(const Config& config); + void run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer); + + protected: + + static gpu::PipelinePointer _pipeline; + + gpu::FramebufferPointer _destinationFrameBuffer; + float _factor{ 2.0f }; + + gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); + }; + + class ResampleToBlitFramebuffer { + public: + using Input = gpu::FramebufferPointer; + using JobModel = Job::ModelIO; + + ResampleToBlitFramebuffer() {} + + void run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer); + + protected: + + static gpu::PipelinePointer _pipeline; + static gpu::PipelinePointer _mirrorPipeline; + }; +} + +#endif // hifi_render_ResampleTask_h \ No newline at end of file From 0d2b2a2aefc60aa3547c09066b2bf11f723cc0c1 Mon Sep 17 00:00:00 2001 From: Anna Date: Fri, 26 Jul 2019 12:53:18 -0700 Subject: [PATCH 14/25] added tone mapping config --- .../render-utils/src/RenderForwardTask.cpp | 2 +- .../src/render/ToneMapAndResampleTask.cpp | 52 ++++++++++++- .../src/render/ToneMapAndResampleTask.h | 74 +++++++++++++++++-- 3 files changed, 118 insertions(+), 10 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 0e3f036e6b..fb2222f98c 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -168,7 +168,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // 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/src/render/ToneMapAndResampleTask.cpp b/libraries/render/src/render/ToneMapAndResampleTask.cpp index c304f12f4a..b551aa14ce 100644 --- a/libraries/render/src/render/ToneMapAndResampleTask.cpp +++ b/libraries/render/src/render/ToneMapAndResampleTask.cpp @@ -77,6 +77,7 @@ void HalfDownsample::run(const RenderContextPointer& renderContext, const gpu::F }); } */ +/* gpu::PipelinePointer Resample::_pipeline; void Resample::configure(const Config& config) { @@ -136,32 +137,74 @@ void Resample::run(const RenderContextPointer& renderContext, const gpu::Framebu args->_viewport = viewport; } } +*/ +ToneMapAndResample::ToneMapAndResample() { + Parameters parameters; + _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); +} -gpu::PipelinePointer ResampleToBlitFramebuffer::_pipeline; -gpu::PipelinePointer ResampleToBlitFramebuffer::_mirrorPipeline; +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 ResampleToBlitFramebuffer::run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer) { +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); @@ -169,6 +212,7 @@ void ResampleToBlitFramebuffer::run(const RenderContextPointer& renderContext, c 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); diff --git a/libraries/render/src/render/ToneMapAndResampleTask.h b/libraries/render/src/render/ToneMapAndResampleTask.h index f900bf85fa..1365cabf71 100644 --- a/libraries/render/src/render/ToneMapAndResampleTask.h +++ b/libraries/render/src/render/ToneMapAndResampleTask.h @@ -17,6 +17,31 @@ #include "Engine.h" namespace render { + + enum class ToneCurve { + // Different tone curve available + None, + Gamma22, + Reinhard, + Filmic, + }; + + 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)ToneCurve::None, std::min((int)ToneCurve::Filmic, newCurve)); emit dirty(); } + + float exposure{ 0.0f }; + int curve{ (int)ToneCurve::Gamma22 }; + signals: + void dirty(); + }; /* class HalfDownsample { public: @@ -37,6 +62,7 @@ namespace render { gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); }; */ +/* class ResampleConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(float factor MEMBER factor NOTIFY dirty) @@ -67,20 +93,58 @@ namespace render { gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); }; - - class ResampleToBlitFramebuffer { + */ + class ToneMapAndResample{ public: + ToneMapAndResample(); + virtual ~ToneMapAndResample() {} + + void setExposure(float exposure); + float getExposure() const { return _parametersBuffer.get()._exposure; } + + void setToneCurve(ToneCurve curve); + ToneCurve getToneCurve() const { return (ToneCurve)_parametersBuffer.get()._toneCurve; } + + // Inputs: lightingFramebuffer, destinationFramebuffer using Input = gpu::FramebufferPointer; - using JobModel = Job::ModelIO; - - ResampleToBlitFramebuffer() {} + using Output = gpu::FramebufferPointer; + using Config = ToneMappingConfig; + //using JobModel = render::Job::ModelIO; + using JobModel = Job::ModelIO; + void configure(const Config& config); void run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer); protected: static gpu::PipelinePointer _pipeline; static gpu::PipelinePointer _mirrorPipeline; + + gpu::FramebufferPointer _destinationFrameBuffer; + + float _factor{ 2.0f }; + + gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); + + 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 = (int)ToneCurve::Gamma22; + glm::vec3 spareB; + + Parameters() {} + }; + typedef gpu::BufferView UniformBufferView; + gpu::BufferView _parametersBuffer; + + void init(RenderArgs* args); }; } From 6a6b2f6d27c3f07125f9432ed6de78858e181355 Mon Sep 17 00:00:00 2001 From: Anna Date: Fri, 26 Jul 2019 18:55:08 -0700 Subject: [PATCH 15/25] added tone mapping back --- interface/src/ui/Snapshot.cpp | 2 +- libraries/render-utils/src/BloomEffect.cpp | 2 +- .../render-utils/src/RenderDeferredTask.cpp | 8 +- .../render-utils/src/RenderForwardTask.cpp | 9 +- .../src/ToneMapAndResampleTask.cpp | 109 +++++++++ .../src}/ToneMapAndResampleTask.h | 17 +- .../render-utils/src/ToneMappingEffect.cpp | 96 -------- .../render-utils/src/ToneMappingEffect.h | 96 -------- .../src/render-utils/toneMapping.slp | 1 + libraries/render-utils/src/toneMapping.slf | 6 +- .../src/render/ToneMapAndResampleTask.cpp | 224 ------------------ 11 files changed, 136 insertions(+), 434 deletions(-) create mode 100644 libraries/render-utils/src/ToneMapAndResampleTask.cpp rename libraries/{render/src/render => render-utils/src}/ToneMapAndResampleTask.h (91%) delete mode 100644 libraries/render-utils/src/ToneMappingEffect.cpp delete mode 100644 libraries/render-utils/src/ToneMappingEffect.h delete mode 100644 libraries/render/src/render/ToneMapAndResampleTask.cpp 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 From 8aef9db4b9710463966091425056a5d8586a2128 Mon Sep 17 00:00:00 2001 From: Anna Date: Fri, 26 Jul 2019 20:09:18 -0700 Subject: [PATCH 16/25] works on android! --- .../render-utils/src/RenderCommonTask.cpp | 24 ++++++++- libraries/render-utils/src/RenderCommonTask.h | 11 ++++ .../render-utils/src/RenderForwardTask.cpp | 16 +++--- .../src/ToneMapAndResampleTask.cpp | 20 ++++---- .../render-utils/src/ToneMapAndResampleTask.h | 51 ------------------- 5 files changed, 50 insertions(+), 72 deletions(-) diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index 9ea4ac9f3c..8868d2fe7c 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -148,6 +148,28 @@ void Blit::run(const RenderContextPointer& renderContext, const gpu::Framebuffer }); } +void NewFramebuffer::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) { + RenderArgs* args = renderContext->args; + // auto frameSize = input; + glm::uvec2 frameSize(args->_viewport.z, args->_viewport.w); + output.reset(); + + // Else use the lodal Framebuffer + if (_outputFramebuffer && _outputFramebuffer->getSize() != frameSize) { + _outputFramebuffer.reset(); + } + + if (!_outputFramebuffer) { + _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer.out")); + auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); + auto colorTexture = gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler); + _outputFramebuffer->setRenderBuffer(0, colorTexture); + } + + output = _outputFramebuffer; +} + void NewOrDefaultFramebuffer::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) { RenderArgs* args = renderContext->args; // auto frameSize = input; @@ -168,7 +190,7 @@ void NewOrDefaultFramebuffer::run(const render::RenderContextPointer& renderCont if (!_outputFramebuffer) { _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer.out")); - auto colorFormat = gpu::Element::COLOR_SRGBA_32; + auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto colorTexture = gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler); _outputFramebuffer->setRenderBuffer(0, colorTexture); diff --git a/libraries/render-utils/src/RenderCommonTask.h b/libraries/render-utils/src/RenderCommonTask.h index ec50fbf2cc..a9bea8b672 100644 --- a/libraries/render-utils/src/RenderCommonTask.h +++ b/libraries/render-utils/src/RenderCommonTask.h @@ -83,6 +83,17 @@ public: void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer); }; +class NewFramebuffer { +public: + using Input = glm::uvec2; + using Output = gpu::FramebufferPointer; + using JobModel = render::Job::ModelIO; + + void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output); +private: + gpu::FramebufferPointer _outputFramebuffer; +}; + class NewOrDefaultFramebuffer { public: using Input = glm::uvec2; diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index f7c62c9c8e..6a39a937a0 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -143,7 +143,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("DrawZoneStack", debugZoneInputs); } -#if defined(Q_OS_ANDROID) +#if !defined(Q_OS_ANDROID) // Just resolve the msaa const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast(nullptr)).asVarying(); @@ -151,8 +151,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto toneMappedBuffer = resolvedFramebuffer; #else - const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); - + const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); // Just resolve the msaa const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); @@ -161,13 +160,12 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend // Lighting Buffer ready for tone mapping // Forward rendering on GLES doesn't support tonemapping to and from the same FBO, so we specify // the output FBO as null, which causes the tonemapping to target the blit framebuffer - const auto toneMappingInputs = ToneMappingDeferred::Input(resolvedFramebuffer, resolvedFramebuffer).asVarying(); - const auto toneMappedBuffer = task.addJob("ToneMapping", toneMappingInputs); + //const auto toneMappingInputs = ToneMappingDeferred::Input(resolvedFramebuffer, resolvedFramebuffer).asVarying(); + //const auto toneMappedBuffer = task.addJob("ToneMapping", toneMappingInputs); #endif - // Upscale to finale resolution - const auto primaryFramebuffer = task.addJob("ToneMapAndResample", toneMappedBuffer); + const auto primaryFramebuffer = task.addJob("ToneMapAndResample", resolvedFramebuffer); // HUD Layer const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); @@ -178,8 +176,8 @@ gpu::FramebufferPointer PreparePrimaryFramebufferMSAA::createFramebuffer(const c gpu::FramebufferPointer framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(name)); auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); - - auto colorFormat = gpu::Element::COLOR_SRGBA_32; + + auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); auto colorTexture = gpu::Texture::createRenderBufferMultisample(colorFormat, frameSize.x, frameSize.y, numSamples, defaultSampler); framebuffer->setRenderBuffer(0, colorTexture); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index 5fc331fab9..b67b70b76c 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -57,18 +57,14 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In RenderArgs* args = renderContext->args; auto sourceFramebuffer = input; - //auto lightingBuffer = input->getRenderBuffer(0); + auto lightingBuffer = input->getRenderBuffer(0); resampledFrameBuffer = args->_blitFramebuffer; -/* - if (!_pipeline) { - init(args); - } +/* if (!lightingBuffer || !blitFramebuffer) { return; - } - */ + }*/ if (resampledFrameBuffer != sourceFramebuffer) { @@ -76,7 +72,7 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In gpu::StatePointer state = gpu::StatePointer(new gpu::State()); state->setDepthTest(gpu::State::DepthTest(false, false)); - //blitState->setColorWriteMask(true, true, true, true); + state->setColorWriteMask(true, true, true, true); _pipeline = gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), state); _mirrorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), state); @@ -84,7 +80,7 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In const auto bufferSize = resampledFrameBuffer->getSize(); - //auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); + auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); glm::ivec4 viewport{ 0, 0, bufferSize.x, bufferSize.y }; @@ -98,8 +94,10 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In 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.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(srcBufferSize, args->_viewport)); + batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); + batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer); + //batch.setResourceTexture(0, sourceFramebuffer->getRenderBuffer(0)); batch.draw(gpu::TRIANGLE_STRIP, 4); }); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h index 6bf6fb3c85..1a4459bda3 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -47,58 +47,7 @@ signals: void dirty(); }; -/* - class HalfDownsample { - public: - using Config = JobConfig; - using JobModel = Job::ModelIO; - HalfDownsample(); - - void configure(const Config& config); - void run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer); - - protected: - - static gpu::PipelinePointer _pipeline; - - gpu::FramebufferPointer _destinationFrameBuffer; - - gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); - }; -*/ -/* - class ResampleConfig : public render::Job::Config { - Q_OBJECT - Q_PROPERTY(float factor MEMBER factor NOTIFY dirty) - public: - - float factor{ 1.0f }; - - signals: - void dirty(); - }; - - class Resample { - public: - using Config = ResampleConfig; - using JobModel = Job::ModelIO; - - Resample(float factor = 2.0f) : _factor{ factor } {} - - void configure(const Config& config); - void run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& sourceFramebuffer, gpu::FramebufferPointer& resampledFrameBuffer); - - protected: - - static gpu::PipelinePointer _pipeline; - - gpu::FramebufferPointer _destinationFrameBuffer; - float _factor{ 2.0f }; - - gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); - }; - */ class ToneMapAndResample{ public: ToneMapAndResample(); From db49a0b9d65cb66054fbbbb181d65d74b55a7acb Mon Sep 17 00:00:00 2001 From: Anna Date: Mon, 29 Jul 2019 11:55:12 -0700 Subject: [PATCH 17/25] fixed some typos from merge --- .../render-utils/src/RenderForwardTask.cpp | 25 ++++++------------- .../src/ToneMapAndResampleTask.cpp | 6 ++--- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 866c1db2a1..714291d103 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -140,29 +140,18 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("DrawZoneStack", debugZoneInputs); } -#if !defined(Q_OS_ANDROID) - - // Just resolve the msaa - const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast(nullptr)).asVarying(); - const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); - - //const auto toneMappedBuffer = resolvedFramebuffer; -#else const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); - // Just resolve the msaa + #if 1 + const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast(nullptr)).asVarying(); + #else const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); + #endif + const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); - // Lighting Buffer ready for tone mapping - // Forward rendering on GLES doesn't support tonemapping to and from the same FBO, so we specify - // the output FBO as null, which causes the tonemapping to target the blit framebuffer - //const auto toneMappingInputs = ToneMappingDeferred::Input(resolvedFramebuffer, resolvedFramebuffer).asVarying(); - //const auto toneMappedBuffer = task.addJob("ToneMapping", toneMappingInputs); - -#endif - - const auto primaryFramebuffer = task.addJob("ToneMapAndResample", resolvedFramebuffer); + //const auto toneMappingInputs = ToneMappingDeferred::Input(resolvedFramebuffer, args->blitFramebuffer).asVarying(); + const auto toneMappedBuffer = task.addJob("ToneMapAndResample", resolvedFramebuffer); // HUD Layer const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index 9608309ee2..adafdf0531 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -73,7 +73,7 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In resampledFrameBuffer = args->_blitFramebuffer; - if (!lightingBuffer || !blitFramebuffer) { + if (!lightingBuffer || !resampledFramebuffer) { return; } @@ -105,8 +105,6 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In }); // Set full final viewport - args->_viewport = viewport; - - output = blitFramebuffer; + args->_viewport = destViewport; } } \ No newline at end of file From 2fca77867ba42a3b7d5a137868b325c79efc5797 Mon Sep 17 00:00:00 2001 From: Anna Date: Mon, 29 Jul 2019 13:45:08 -0700 Subject: [PATCH 18/25] broken on android again somehow --- libraries/render-utils/src/BloomEffect.cpp | 3 +-- .../render-utils/src/RenderCommonTask.cpp | 8 ++++++- .../render-utils/src/RenderForwardTask.cpp | 7 +++--- .../src/ToneMapAndResampleTask.cpp | 22 ++++++++++++------- libraries/render-utils/src/toneMapping.slf | 2 +- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/libraries/render-utils/src/BloomEffect.cpp b/libraries/render-utils/src/BloomEffect.cpp index a069aa60fa..10df138fad 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -60,8 +60,7 @@ void BloomThreshold::run(const render::RenderContextPointer& renderContext, cons auto colorTexture = gpu::TexturePointer(gpu::Texture::createRenderBuffer(inputBuffer->getTexelFormat(), bufferSize.x, bufferSize.y, gpu::Texture::SINGLE_MIP, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT, gpu::Sampler::WRAP_CLAMP))); - //_outputBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("BloomThreshold")); - _outputBuffer = args->_blitFramebuffer; + _outputBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("BloomThreshold")); _outputBuffer->setRenderBuffer(0, colorTexture); _parameters.edit()._deltaUV = { 1.0f / bufferSize.x, 1.0f / bufferSize.y }; diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index 8868d2fe7c..cddf1a6410 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -154,13 +154,19 @@ void NewFramebuffer::run(const render::RenderContextPointer& renderContext, cons glm::uvec2 frameSize(args->_viewport.z, args->_viewport.w); output.reset(); + auto destBlitFbo = args->_blitFramebuffer; + if (destBlitFbo && destBlitFbo->getSize() == frameSize) { + output = destBlitFbo; + return; + } + // Else use the lodal Framebuffer if (_outputFramebuffer && _outputFramebuffer->getSize() != frameSize) { _outputFramebuffer.reset(); } if (!_outputFramebuffer) { - _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer.out")); + _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer2.out")); auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto colorTexture = gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler); diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 714291d103..97d0bbbc2e 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -140,7 +140,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("DrawZoneStack", debugZoneInputs); } - const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); + //const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); #if 1 const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast(nullptr)).asVarying(); @@ -149,12 +149,13 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend #endif const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); + const auto toneMappedBuffer = resolvedFramebuffer; //const auto toneMappingInputs = ToneMappingDeferred::Input(resolvedFramebuffer, args->blitFramebuffer).asVarying(); - const auto toneMappedBuffer = task.addJob("ToneMapAndResample", resolvedFramebuffer); + const auto primaryFramebuffer = task.addJob("ToneMapAndResample", toneMappedBuffer); // HUD Layer - const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); + const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); } diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index adafdf0531..dbd735f098 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -29,9 +29,8 @@ ToneMapAndResample::ToneMapAndResample() { Parameters parameters; _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); } - -void ToneMapAndResample::init(RenderArgs* args) { - +/* +void ToneMapAndResample::init() { // shared_ptr to gpu::State gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); @@ -41,6 +40,7 @@ void ToneMapAndResample::init(RenderArgs* args) { _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), blitState)); _mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), blitState)); } + */ void ToneMapAndResample::setExposure(float exposure) { auto& params = _parametersBuffer.get(); @@ -72,20 +72,26 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In auto lightingBuffer = input->getRenderBuffer(0); resampledFrameBuffer = args->_blitFramebuffer; - - if (!lightingBuffer || !resampledFramebuffer) { +/* + if (!lightingBuffer || !resampledFrameBuffer) { return; - } + }*/ if (resampledFrameBuffer != sourceFramebuffer) { if (!_pipeline) { - init(args); + gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); + + blitState->setDepthTest(gpu::State::DepthTest(false, false)); + blitState->setColorWriteMask(true, true, true, true); + + _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), blitState)); + _mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), blitState)); } const auto bufferSize = resampledFrameBuffer->getSize(); - const auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); + auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); glm::ivec4 destViewport{ 0, 0, bufferSize.x, bufferSize.y }; diff --git a/libraries/render-utils/src/toneMapping.slf b/libraries/render-utils/src/toneMapping.slf index d90d1b3c8a..32aa2b0788 100644 --- a/libraries/render-utils/src/toneMapping.slf +++ b/libraries/render-utils/src/toneMapping.slf @@ -44,7 +44,7 @@ layout(location=0) out vec4 outFragColor; void main(void) { <@if HIFI_USE_MIRRORED@> - vec4 fragColorRaw = texture(colorMap, vec2(1.0 - varTexCoord0.x, varTexCoord0.y); + vec4 fragColorRaw = texture(colorMap, vec2(1.0 - varTexCoord0.x, varTexCoord0.y)); <@else@> vec4 fragColorRaw = texture(colorMap, varTexCoord0); <@endif@> From 3a437cf19013f1b147a8acfd24687debf825a175 Mon Sep 17 00:00:00 2001 From: Anna Date: Mon, 29 Jul 2019 14:59:15 -0700 Subject: [PATCH 19/25] fix on android, merge android and windows forward pipelines --- libraries/render-utils/src/RenderCommonTask.cpp | 10 ++-------- libraries/render-utils/src/RenderForwardTask.cpp | 13 +++---------- .../render-utils/src/ToneMapAndResampleTask.cpp | 15 ++++----------- .../render-utils/src/ToneMapAndResampleTask.h | 2 +- 4 files changed, 10 insertions(+), 30 deletions(-) diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index cddf1a6410..9338cefa82 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -154,19 +154,13 @@ void NewFramebuffer::run(const render::RenderContextPointer& renderContext, cons glm::uvec2 frameSize(args->_viewport.z, args->_viewport.w); output.reset(); - auto destBlitFbo = args->_blitFramebuffer; - if (destBlitFbo && destBlitFbo->getSize() == frameSize) { - output = destBlitFbo; - return; - } - // Else use the lodal Framebuffer if (_outputFramebuffer && _outputFramebuffer->getSize() != frameSize) { _outputFramebuffer.reset(); } if (!_outputFramebuffer) { - _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer2.out")); + _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer.out")); auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto colorTexture = gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler); @@ -195,7 +189,7 @@ void NewOrDefaultFramebuffer::run(const render::RenderContextPointer& renderCont } if (!_outputFramebuffer) { - _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer.out")); + _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newOrDefaultFramebuffer.out")); auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto colorTexture = gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler); diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 97d0bbbc2e..814c5a9080 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -140,22 +140,15 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("DrawZoneStack", debugZoneInputs); } - //const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); + const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); - #if 1 - const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast(nullptr)).asVarying(); - #else const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); - #endif - const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); - const auto toneMappedBuffer = resolvedFramebuffer; - //const auto toneMappingInputs = ToneMappingDeferred::Input(resolvedFramebuffer, args->blitFramebuffer).asVarying(); - const auto primaryFramebuffer = task.addJob("ToneMapAndResample", toneMappedBuffer); + const auto toneMappedBuffer = task.addJob("ToneMapAndResample", resolvedFramebuffer); // HUD Layer - const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(primaryFramebuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); + const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); } diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index dbd735f098..45370d1dee 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -29,7 +29,7 @@ ToneMapAndResample::ToneMapAndResample() { Parameters parameters; _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); } -/* + void ToneMapAndResample::init() { // shared_ptr to gpu::State gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); @@ -40,7 +40,6 @@ void ToneMapAndResample::init() { _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), blitState)); _mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), blitState)); } - */ void ToneMapAndResample::setExposure(float exposure) { auto& params = _parametersBuffer.get(); @@ -72,21 +71,15 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In auto lightingBuffer = input->getRenderBuffer(0); resampledFrameBuffer = args->_blitFramebuffer; -/* + if (!lightingBuffer || !resampledFrameBuffer) { return; - }*/ + } if (resampledFrameBuffer != sourceFramebuffer) { if (!_pipeline) { - gpu::StatePointer blitState = gpu::StatePointer(new gpu::State()); - - blitState->setDepthTest(gpu::State::DepthTest(false, false)); - blitState->setColorWriteMask(true, true, true, true); - - _pipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping), blitState)); - _mirrorPipeline = gpu::PipelinePointer(gpu::Pipeline::create(gpu::Shader::createProgram(toneMapping_mirrored), blitState)); + init(); } const auto bufferSize = resampledFrameBuffer->getSize(); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h index 659d06c433..6d7def5f85 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -96,7 +96,7 @@ private: typedef gpu::BufferView UniformBufferView; gpu::BufferView _parametersBuffer; - void init(RenderArgs* args); + void init(); }; #endif // hifi_ToneMapAndResample_h From d3107efb8280a418ee17248608ae2e94e68daad9 Mon Sep 17 00:00:00 2001 From: Anna Date: Mon, 29 Jul 2019 16:27:54 -0700 Subject: [PATCH 20/25] added optional output buffer to ToneMapAndResampleTask --- libraries/render-utils/CMakeLists.txt | 4 +- .../render-utils/src/RenderForwardTask.cpp | 8 ++- .../src/ToneMapAndResampleTask.cpp | 71 ++++++++++--------- .../render-utils/src/ToneMapAndResampleTask.h | 4 +- 4 files changed, 48 insertions(+), 39 deletions(-) diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index 833d78bb74..4fbd076d05 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -12,7 +12,9 @@ include_hifi_library_headers(hfm) # tell CMake to exclude qrc_fonts.cpp for policy CMP0071 set_property(SOURCE qrc_fonts.cpp PROPERTY SKIP_AUTOMOC ON) -if (NOT ANDROID) +if (ANDROID) + target_link_libraries(${TARGET_NAME} android log) +else() target_nsight() endif () diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 814c5a9080..33af6aaa71 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -145,8 +145,14 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); - const auto toneMappedBuffer = task.addJob("ToneMapAndResample", resolvedFramebuffer); +#if defined(Q_OS_ANDROID) + const auto destFramebuffer = static_cast(nullptr); +#else + const auto destFramebuffer = resolvedFramebuffer; +#endif + const auto toneMappingInputs = ToneMapAndResample::Input(resolvedFramebuffer, destFramebuffer).asVarying(); + const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); // HUD Layer const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index 45370d1dee..d9439f7a92 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -3,7 +3,7 @@ // libraries/render-utils/src // // Created by Anna Brewer on 7/3/19. -// Copyright 2015 High Fidelity, Inc. +// Copyright 2019 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 @@ -61,49 +61,50 @@ void ToneMapAndResample::configure(const Config& config) { setToneCurve((ToneCurve)config.curve); } -void ToneMapAndResample::run(const RenderContextPointer& renderContext, const Input& input, gpu::FramebufferPointer& resampledFrameBuffer) { +void ToneMapAndResample::run(const RenderContextPointer& renderContext, const Input& input, Output& output) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); RenderArgs* args = renderContext->args; - auto sourceFramebuffer = input; - auto lightingBuffer = input->getRenderBuffer(0); + auto lightingBuffer = input.get0()->getRenderBuffer(0); + auto resampledFramebuffer = input.get1(); - resampledFrameBuffer = args->_blitFramebuffer; + if (!resampledFramebuffer) { + resampledFramebuffer = args->_blitFramebuffer; + } - if (!lightingBuffer || !resampledFrameBuffer) { + if (!lightingBuffer || !resampledFramebuffer) { return; } - if (resampledFrameBuffer != sourceFramebuffer) { - - if (!_pipeline) { - init(); - } - - const auto bufferSize = resampledFrameBuffer->getSize(); - - auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); - - glm::ivec4 destViewport{ 0, 0, bufferSize.x, bufferSize.y }; - - gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) { - batch.enableStereo(false); - batch.setFramebuffer(resampledFrameBuffer); - - batch.setViewportTransform(destViewport); - batch.setProjectionTransform(glm::mat4()); - batch.resetViewTransform(); - batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); - - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(srcBufferSize, args->_viewport)); - batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); - batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer); - batch.draw(gpu::TRIANGLE_STRIP, 4); - }); - - // Set full final viewport - args->_viewport = destViewport; + if (!_pipeline) { + init(); } + + const auto bufferSize = resampledFramebuffer->getSize(); + + auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); + + glm::ivec4 destViewport{ 0, 0, bufferSize.x, bufferSize.y }; + + gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) { + batch.enableStereo(false); + batch.setFramebuffer(resampledFramebuffer); + + batch.setViewportTransform(destViewport); + batch.setProjectionTransform(glm::mat4()); + batch.resetViewTransform(); + batch.setPipeline(args->_renderMode == RenderArgs::MIRROR_RENDER_MODE ? _mirrorPipeline : _pipeline); + + batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(srcBufferSize, args->_viewport)); + batch.setUniformBuffer(render_utils::slot::buffer::ToneMappingParams, _parametersBuffer); + batch.setResourceTexture(render_utils::slot::texture::ToneMappingColor, lightingBuffer); + batch.draw(gpu::TRIANGLE_STRIP, 4); + }); + + // Set full final viewport + args->_viewport = destViewport; + + output = resampledFramebuffer; } \ No newline at end of file diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h index 6d7def5f85..d02cb4afda 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -3,7 +3,7 @@ // libraries/render-utils/src // // Created by Anna Brewer on 7/3/19. -// Copyright 2015 High Fidelity, Inc. +// Copyright 2019 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 @@ -59,7 +59,7 @@ public: ToneCurve getToneCurve() const { return (ToneCurve)_parametersBuffer.get()._toneCurve; } // Inputs: lightingFramebuffer, destinationFramebuffer - using Input = gpu::FramebufferPointer; + using Input = render::VaryingSet2; using Output = gpu::FramebufferPointer; using Config = ToneMappingConfig; using JobModel = render::Job::ModelIO; From 379a262b072b84909a24dab25f83941a3da01af4 Mon Sep 17 00:00:00 2001 From: Anna Date: Mon, 29 Jul 2019 18:15:54 -0700 Subject: [PATCH 21/25] bug fix in deferred, finish merging android & windows forward --- libraries/render-utils/src/RenderDeferredTask.cpp | 4 +++- libraries/render-utils/src/RenderForwardTask.cpp | 4 ---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index cffbad0e44..7f91c6eaf2 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -237,8 +237,10 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto bloomInputs = BloomEffect::Inputs(deferredFrameTransform, lightingFramebuffer, bloomFrame).asVarying(); task.addJob("Bloom", bloomInputs); + const auto destFramebuffer = static_cast(nullptr); + // Lighting Buffer ready for tone mapping - const auto toneMappingInputs = lightingFramebuffer; + const auto toneMappingInputs = ToneMapAndResample::Input(lightingFramebuffer, destFramebuffer).asVarying(); const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); // Debugging task is happening in the "over" layer after tone mapping and just before HUD diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 33af6aaa71..fdcb6c6741 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -145,11 +145,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); -#if defined(Q_OS_ANDROID) const auto destFramebuffer = static_cast(nullptr); -#else - const auto destFramebuffer = resolvedFramebuffer; -#endif const auto toneMappingInputs = ToneMapAndResample::Input(resolvedFramebuffer, destFramebuffer).asVarying(); const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); From 458b3f18df4e64453d25b627019379d7ac0675f3 Mon Sep 17 00:00:00 2001 From: Anna Date: Mon, 29 Jul 2019 18:25:36 -0700 Subject: [PATCH 22/25] changes from cr --- libraries/render-utils/src/DeferredLightingEffect.cpp | 3 --- libraries/render-utils/src/ToneMapAndResampleTask.h | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index d8ccef0064..8d7fc345ac 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -29,9 +29,6 @@ #include "TextureCache.h" #include "FramebufferCache.h" -#include -#include - namespace ru { using render_utils::slot::texture::Texture; using render_utils::slot::buffer::Buffer; diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h index d02cb4afda..d2b166392e 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -30,7 +30,7 @@ enum class ToneCurve { class ToneMappingConfig : public render::Job::Config { Q_OBJECT - Q_PROPERTY(float exposure MEMBER exposure WRITE setExposure); + Q_PROPERTY(float exposure MEMBER exposure WRITE setExposure); Q_PROPERTY(int curve MEMBER curve WRITE setCurve); public: ToneMappingConfig() : render::Job::Config(true) {} From 0cd532a47b6fe8c187f4e76f09cbbb1ad5b9acaf Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 30 Jul 2019 10:08:38 -0700 Subject: [PATCH 23/25] cleaning up --- libraries/platform/src/platform/backend/PlatformInstance.cpp | 2 +- libraries/render-utils/CMakeLists.txt | 4 +--- libraries/render-utils/src/RenderCommonTask.cpp | 1 - libraries/render-utils/src/ToneMapAndResampleTask.cpp | 2 +- libraries/render-utils/src/ToneMapAndResampleTask.h | 5 +++-- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/libraries/platform/src/platform/backend/PlatformInstance.cpp b/libraries/platform/src/platform/backend/PlatformInstance.cpp index 2f68972c4a..e02eaf2837 100644 --- a/libraries/platform/src/platform/backend/PlatformInstance.cpp +++ b/libraries/platform/src/platform/backend/PlatformInstance.cpp @@ -104,6 +104,7 @@ void Instance::enumerateNics() { } } } + json Instance::getCPU(int index) { assert(index < (int)_cpus.size()); @@ -146,7 +147,6 @@ Instance::~Instance() { } } - json Instance::listAllKeys() { json allKeys; allKeys.array({{ diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index 4fbd076d05..833d78bb74 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -12,9 +12,7 @@ include_hifi_library_headers(hfm) # tell CMake to exclude qrc_fonts.cpp for policy CMP0071 set_property(SOURCE qrc_fonts.cpp PROPERTY SKIP_AUTOMOC ON) -if (ANDROID) - target_link_libraries(${TARGET_NAME} android log) -else() +if (NOT ANDROID) target_nsight() endif () diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index 9338cefa82..bdcba3e931 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -154,7 +154,6 @@ void NewFramebuffer::run(const render::RenderContextPointer& renderContext, cons glm::uvec2 frameSize(args->_viewport.z, args->_viewport.w); output.reset(); - // Else use the lodal Framebuffer if (_outputFramebuffer && _outputFramebuffer->getSize() != frameSize) { _outputFramebuffer.reset(); } diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index d9439f7a92..54821b0380 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -107,4 +107,4 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In args->_viewport = destViewport; output = resampledFramebuffer; -} \ No newline at end of file +} diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.h b/libraries/render-utils/src/ToneMapAndResampleTask.h index d2b166392e..1c7ef2cf48 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.h +++ b/libraries/render-utils/src/ToneMapAndResampleTask.h @@ -32,6 +32,7 @@ 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) {} @@ -41,6 +42,7 @@ public: float exposure{ 0.0f }; int curve{ (int)ToneCurve::Gamma22 }; + signals: void dirty(); }; @@ -68,7 +70,6 @@ public: void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output); protected: - static gpu::PipelinePointer _pipeline; static gpu::PipelinePointer _mirrorPipeline; @@ -79,7 +80,6 @@ protected: gpu::FramebufferPointer getResampledFrameBuffer(const gpu::FramebufferPointer& sourceFramebuffer); private: - gpu::PipelinePointer _blitLightBuffer; // Class describing the uniform buffer with all the parameters common to the tone mapping shaders @@ -93,6 +93,7 @@ private: Parameters() {} }; + typedef gpu::BufferView UniformBufferView; gpu::BufferView _parametersBuffer; From f58400950a0d11035cfa2740e292475c2e55eb59 Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 30 Jul 2019 11:57:01 -0700 Subject: [PATCH 24/25] made color format for resolve FB a parameter, reverted name of tonemapping task to preserve back compatibility --- interface/src/ui/Snapshot.cpp | 1 - libraries/render-utils/src/BloomEffect.cpp | 1 - libraries/render-utils/src/RenderCommonTask.cpp | 11 +++++++---- libraries/render-utils/src/RenderCommonTask.h | 9 ++++++--- libraries/render-utils/src/RenderDeferredTask.cpp | 2 +- libraries/render-utils/src/RenderForwardTask.cpp | 4 ++-- .../render-utils/src/ToneMapAndResampleTask.cpp | 14 +++++++------- 7 files changed, 23 insertions(+), 19 deletions(-) diff --git a/interface/src/ui/Snapshot.cpp b/interface/src/ui/Snapshot.cpp index 363e7a5cf1..bb9971e582 100644 --- a/interface/src/ui/Snapshot.cpp +++ b/interface/src/ui/Snapshot.cpp @@ -41,7 +41,6 @@ #include "MainWindow.h" #include "Snapshot.h" #include "SnapshotUploader.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 10df138fad..e58d07ac33 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -15,7 +15,6 @@ #include #include -#include "ToneMapAndResampleTask.h" #include "render-utils/ShaderConstants.h" #define BLOOM_BLUR_LEVEL_COUNT 3 diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index bdcba3e931..43983b76f7 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -148,9 +148,12 @@ void Blit::run(const RenderContextPointer& renderContext, const gpu::Framebuffer }); } -void NewFramebuffer::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) { +NewFramebuffer::NewFramebuffer(gpu::Element pixelFormat = gpu::Element::COLOR_SRGBA_32) { + _pixelFormat = pixelFormat; +} + +void NewFramebuffer::run(const render::RenderContextPointer& renderContext, Output& output) { RenderArgs* args = renderContext->args; - // auto frameSize = input; glm::uvec2 frameSize(args->_viewport.z, args->_viewport.w); output.reset(); @@ -160,7 +163,7 @@ void NewFramebuffer::run(const render::RenderContextPointer& renderContext, cons if (!_outputFramebuffer) { _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newFramebuffer.out")); - auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); + auto colorFormat = _pixelFormat; auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto colorTexture = gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler); _outputFramebuffer->setRenderBuffer(0, colorTexture); @@ -189,7 +192,7 @@ void NewOrDefaultFramebuffer::run(const render::RenderContextPointer& renderCont if (!_outputFramebuffer) { _outputFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("newOrDefaultFramebuffer.out")); - auto colorFormat = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10); + auto colorFormat = gpu::Element::COLOR_SRGBA_32; auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto colorTexture = gpu::Texture::createRenderBuffer(colorFormat, frameSize.x, frameSize.y, gpu::Texture::SINGLE_MIP, defaultSampler); _outputFramebuffer->setRenderBuffer(0, colorTexture); diff --git a/libraries/render-utils/src/RenderCommonTask.h b/libraries/render-utils/src/RenderCommonTask.h index a9bea8b672..446d6a351c 100644 --- a/libraries/render-utils/src/RenderCommonTask.h +++ b/libraries/render-utils/src/RenderCommonTask.h @@ -85,11 +85,14 @@ public: class NewFramebuffer { public: - using Input = glm::uvec2; using Output = gpu::FramebufferPointer; - using JobModel = render::Job::ModelIO; + using JobModel = render::Job::ModelO; - void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output); + NewFramebuffer(gpu::Element pixelFormat); + + void run(const render::RenderContextPointer& renderContext, Output& output); +protected: + gpu::Element _pixelFormat; private: gpu::FramebufferPointer _outputFramebuffer; }; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 7f91c6eaf2..4561cf903d 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -241,7 +241,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Lighting Buffer ready for tone mapping const auto toneMappingInputs = ToneMapAndResample::Input(lightingFramebuffer, destFramebuffer).asVarying(); - const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); + 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 fdcb6c6741..14f2e51697 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -140,7 +140,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend task.addJob("DrawZoneStack", debugZoneInputs); } - const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer"); + const auto newResolvedFramebuffer = task.addJob("MakeResolvingFramebuffer", gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::R11G11B10)); const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, newResolvedFramebuffer).asVarying(); const auto resolvedFramebuffer = task.addJob("Resolve", resolveInputs); @@ -148,7 +148,7 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto destFramebuffer = static_cast(nullptr); const auto toneMappingInputs = ToneMapAndResample::Input(resolvedFramebuffer, destFramebuffer).asVarying(); - const auto toneMappedBuffer = task.addJob("ToneMapAndResample", toneMappingInputs); + const auto toneMappedBuffer = task.addJob("ToneMapping", toneMappingInputs); // HUD Layer const auto renderHUDLayerInputs = RenderHUDLayerTask::Input(toneMappedBuffer, lightingModel, hudOpaque, hudTransparent, hazeFrame).asVarying(); task.addJob("RenderHUDLayer", renderHUDLayerInputs); diff --git a/libraries/render-utils/src/ToneMapAndResampleTask.cpp b/libraries/render-utils/src/ToneMapAndResampleTask.cpp index 54821b0380..8d4a3c485d 100644 --- a/libraries/render-utils/src/ToneMapAndResampleTask.cpp +++ b/libraries/render-utils/src/ToneMapAndResampleTask.cpp @@ -68,13 +68,13 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In RenderArgs* args = renderContext->args; auto lightingBuffer = input.get0()->getRenderBuffer(0); - auto resampledFramebuffer = input.get1(); + auto destinationFramebuffer = input.get1(); - if (!resampledFramebuffer) { - resampledFramebuffer = args->_blitFramebuffer; + if (!destinationFramebuffer) { + destinationFramebuffer = args->_blitFramebuffer; } - if (!lightingBuffer || !resampledFramebuffer) { + if (!lightingBuffer || !destinationFramebuffer) { return; } @@ -82,7 +82,7 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In init(); } - const auto bufferSize = resampledFramebuffer->getSize(); + const auto bufferSize = destinationFramebuffer->getSize(); auto srcBufferSize = glm::ivec2(lightingBuffer->getDimensions()); @@ -90,7 +90,7 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In gpu::doInBatch("Resample::run", args->_context, [&](gpu::Batch& batch) { batch.enableStereo(false); - batch.setFramebuffer(resampledFramebuffer); + batch.setFramebuffer(destinationFramebuffer); batch.setViewportTransform(destViewport); batch.setProjectionTransform(glm::mat4()); @@ -106,5 +106,5 @@ void ToneMapAndResample::run(const RenderContextPointer& renderContext, const In // Set full final viewport args->_viewport = destViewport; - output = resampledFramebuffer; + output = destinationFramebuffer; } From 4e4f8866cd077e0125bc5da02392fb25f7236c84 Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 30 Jul 2019 13:15:26 -0700 Subject: [PATCH 25/25] fix android/mac build error --- libraries/render-utils/src/RenderCommonTask.cpp | 2 +- libraries/render-utils/src/RenderCommonTask.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index 43983b76f7..7cf7f1129f 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -148,7 +148,7 @@ void Blit::run(const RenderContextPointer& renderContext, const gpu::Framebuffer }); } -NewFramebuffer::NewFramebuffer(gpu::Element pixelFormat = gpu::Element::COLOR_SRGBA_32) { +NewFramebuffer::NewFramebuffer(gpu::Element pixelFormat) { _pixelFormat = pixelFormat; } diff --git a/libraries/render-utils/src/RenderCommonTask.h b/libraries/render-utils/src/RenderCommonTask.h index 446d6a351c..15d6ff9895 100644 --- a/libraries/render-utils/src/RenderCommonTask.h +++ b/libraries/render-utils/src/RenderCommonTask.h @@ -88,7 +88,7 @@ public: using Output = gpu::FramebufferPointer; using JobModel = render::Job::ModelO; - NewFramebuffer(gpu::Element pixelFormat); + NewFramebuffer(gpu::Element pixelFormat = gpu::Element::COLOR_SRGBA_32); void run(const render::RenderContextPointer& renderContext, Output& output); protected: