From b59d967b6c2a8a50662e26cadb7f9cc16513dbf3 Mon Sep 17 00:00:00 2001 From: Anna Date: Thu, 11 Jul 2019 16:44:56 -0700 Subject: [PATCH] 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])