From 27b9f3516df5dc2395a4d71b69bfa91b94279f23 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Mon, 25 Sep 2017 18:05:30 +0200 Subject: [PATCH] Added mix parameter to blur and bloom --- libraries/render-utils/src/BloomEffect.cpp | 9 +++++---- libraries/render-utils/src/BloomEffect.h | 8 ++++---- libraries/render/src/render/BlurTask.cpp | 19 ++++++++++++++++--- libraries/render/src/render/BlurTask.h | 10 +++++++--- libraries/render/src/render/BlurTask.slh | 3 ++- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/libraries/render-utils/src/BloomEffect.cpp b/libraries/render-utils/src/BloomEffect.cpp index eb02c4fa57..24cdd5fca3 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -12,15 +12,16 @@ #include -void BloomConfig::setMix(float value) { - +void BloomConfig::setIntensity(float value) { + auto blurConfig = getConfig(); + blurConfig->setProperty("mix", value*0.5f); } void BloomConfig::setSize(float value) { auto& blurJob = static_cast(_task)->_jobs.front(); auto& gaussianBlur = blurJob.edit(); auto gaussianBlurParams = gaussianBlur.getParameters(); - gaussianBlurParams->setGaussianFilterTaps((BLUR_MAX_NUM_TAPS - 1) / 2, value*7.0f); + gaussianBlurParams->setFilterGaussianTaps((BLUR_MAX_NUM_TAPS - 1) / 2, value*7.0f); } Bloom::Bloom() { @@ -29,7 +30,7 @@ Bloom::Bloom() { void Bloom::configure(const Config& config) { auto blurConfig = config.getConfig(); - blurConfig->setProperty("filterScale", 2.5f); + blurConfig->setProperty("filterScale", 3.0f); } void Bloom::build(JobModel& task, const render::Varying& inputs, render::Varying& outputs) { diff --git a/libraries/render-utils/src/BloomEffect.h b/libraries/render-utils/src/BloomEffect.h index 278236d2e9..c8588c7a15 100644 --- a/libraries/render-utils/src/BloomEffect.h +++ b/libraries/render-utils/src/BloomEffect.h @@ -16,15 +16,15 @@ class BloomConfig : public render::Task::Config { Q_OBJECT - Q_PROPERTY(float mix MEMBER mix WRITE setMix NOTIFY dirty) + Q_PROPERTY(float intensity MEMBER intensity WRITE setIntensity NOTIFY dirty) Q_PROPERTY(float size MEMBER size WRITE setSize NOTIFY dirty) public: - float mix{ 0.2f }; - float size{ 0.1f }; + float intensity{ 0.2f }; + float size{ 0.4f }; - void setMix(float value); + void setIntensity(float value); void setSize(float value); signals: diff --git a/libraries/render/src/render/BlurTask.cpp b/libraries/render/src/render/BlurTask.cpp index 2e3cf8138f..66f098302d 100644 --- a/libraries/render/src/render/BlurTask.cpp +++ b/libraries/render/src/render/BlurTask.cpp @@ -32,7 +32,7 @@ enum BlurShaderMapSlots { BlurParams::BlurParams() { Params params; _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Params), (const gpu::Byte*) ¶ms)); - setGaussianFilterTaps(3); + setFilterGaussianTaps(3); } void BlurParams::setWidthHeight(int width, int height, bool isStereo) { @@ -77,7 +77,7 @@ void BlurParams::setFilterTap(int index, float offset, float value) { filterTaps[index].y = value; } -void BlurParams::setGaussianFilterTaps(int numHalfTaps, float sigma) { +void BlurParams::setFilterGaussianTaps(int numHalfTaps, float sigma) { auto& params = _parametersBuffer.edit(); const int numTaps = 2 * numHalfTaps + 1; assert(numTaps <= BLUR_MAX_NUM_TAPS); @@ -106,6 +106,14 @@ void BlurParams::setGaussianFilterTaps(int numHalfTaps, float sigma) { // won't have the same number of taps as in the center. } +void BlurParams::setOutputAlpha(float value) { + value = glm::clamp(value, 0.0f, 1.0f); + auto filterInfo = _parametersBuffer.get().filterInfo; + if (value != filterInfo.z) { + _parametersBuffer.edit().filterInfo.z = value; + } +} + void BlurParams::setDepthPerspective(float oneOverTan2FOV) { auto depthInfo = _parametersBuffer.get().depthInfo; if (oneOverTan2FOV != depthInfo.w) { @@ -238,7 +246,13 @@ gpu::PipelinePointer BlurGaussian::getBlurHPipeline() { } void BlurGaussian::configure(const Config& config) { + auto blurHPipeline = getBlurHPipeline(); + _parameters->setFilterRadiusScale(config.filterScale); + _parameters->setOutputAlpha(config.mix); + + blurHPipeline->getState()->setBlendFunction(config.mix < 1.0f, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); } @@ -248,7 +262,6 @@ void BlurGaussian::run(const RenderContextPointer& renderContext, const gpu::Fra RenderArgs* args = renderContext->args; - BlurInOutResource::Resources blurringResources; if (!_inOutResources.updateResources(sourceFramebuffer, blurringResources)) { // early exit if no valid blurring resources diff --git a/libraries/render/src/render/BlurTask.h b/libraries/render/src/render/BlurTask.h index 4df5a09576..cbee3e35f1 100644 --- a/libraries/render/src/render/BlurTask.h +++ b/libraries/render/src/render/BlurTask.h @@ -30,7 +30,8 @@ public: void setFilterNumTaps(int count); // Tap 0 is considered the center of the kernel void setFilterTap(int index, float offset, float value); - void setGaussianFilterTaps(int numHalfTaps, float sigma = 1.47f); + void setFilterGaussianTaps(int numHalfTaps, float sigma = 1.47f); + void setOutputAlpha(float value); void setDepthPerspective(float oneOverTan2FOV); void setDepthThreshold(float threshold); @@ -46,7 +47,7 @@ public: // Viewport to Texcoord info, if the region of the blur (viewport) is smaller than the full frame glm::vec4 texcoordTransform{ 0.0f, 0.0f, 1.0f, 1.0f }; - // Filter info (radius scale, number of taps, mix) + // Filter info (radius scale, number of taps, output alpha) glm::vec4 filterInfo{ 1.0f, 0.0f, 0.0f, 0.0f }; // Depth info (radius scale @@ -93,12 +94,15 @@ public: class BlurGaussianConfig : public Job::Config { Q_OBJECT Q_PROPERTY(bool enabled WRITE setEnabled READ isEnabled NOTIFY dirty) // expose enabled flag - Q_PROPERTY(float filterScale MEMBER filterScale NOTIFY dirty) // expose enabled flag + Q_PROPERTY(float filterScale MEMBER filterScale NOTIFY dirty) + Q_PROPERTY(float mix MEMBER mix NOTIFY dirty) public: BlurGaussianConfig() : Job::Config(true) {} float filterScale{ 0.2f }; + float mix{ 1.0f }; + signals : void dirty(); diff --git a/libraries/render/src/render/BlurTask.slh b/libraries/render/src/render/BlurTask.slh index 5a41a0b1c6..37f29496bd 100644 --- a/libraries/render/src/render/BlurTask.slh +++ b/libraries/render/src/render/BlurTask.slh @@ -41,7 +41,7 @@ int getFilterNumTaps() { return int(parameters.filterInfo.y); } -float getFilterMix() { +float getOutputAlpha() { return parameters.filterInfo.z; } @@ -102,6 +102,7 @@ vec4 pixelShaderGaussian(vec2 texcoord, vec2 direction, vec2 pixelStep) { if (totalWeight>0.0) { srcBlurred /= totalWeight; } + srcBlurred.a = getOutputAlpha(); return srcBlurred; }