Added mix parameter to blur and bloom

This commit is contained in:
Olivier Prat 2017-09-25 18:05:30 +02:00
parent 22b1507597
commit 27b9f3516d
5 changed files with 34 additions and 15 deletions

View file

@ -12,15 +12,16 @@
#include <render/BlurTask.h> #include <render/BlurTask.h>
void BloomConfig::setMix(float value) { void BloomConfig::setIntensity(float value) {
auto blurConfig = getConfig<render::BlurGaussian>();
blurConfig->setProperty("mix", value*0.5f);
} }
void BloomConfig::setSize(float value) { void BloomConfig::setSize(float value) {
auto& blurJob = static_cast<render::Task::TaskConcept*>(_task)->_jobs.front(); auto& blurJob = static_cast<render::Task::TaskConcept*>(_task)->_jobs.front();
auto& gaussianBlur = blurJob.edit<render::BlurGaussian>(); auto& gaussianBlur = blurJob.edit<render::BlurGaussian>();
auto gaussianBlurParams = gaussianBlur.getParameters(); 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() { Bloom::Bloom() {
@ -29,7 +30,7 @@ Bloom::Bloom() {
void Bloom::configure(const Config& config) { void Bloom::configure(const Config& config) {
auto blurConfig = config.getConfig<render::BlurGaussian>(); auto blurConfig = config.getConfig<render::BlurGaussian>();
blurConfig->setProperty("filterScale", 2.5f); blurConfig->setProperty("filterScale", 3.0f);
} }
void Bloom::build(JobModel& task, const render::Varying& inputs, render::Varying& outputs) { void Bloom::build(JobModel& task, const render::Varying& inputs, render::Varying& outputs) {

View file

@ -16,15 +16,15 @@
class BloomConfig : public render::Task::Config { class BloomConfig : public render::Task::Config {
Q_OBJECT 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) Q_PROPERTY(float size MEMBER size WRITE setSize NOTIFY dirty)
public: public:
float mix{ 0.2f }; float intensity{ 0.2f };
float size{ 0.1f }; float size{ 0.4f };
void setMix(float value); void setIntensity(float value);
void setSize(float value); void setSize(float value);
signals: signals:

View file

@ -32,7 +32,7 @@ enum BlurShaderMapSlots {
BlurParams::BlurParams() { BlurParams::BlurParams() {
Params params; Params params;
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Params), (const gpu::Byte*) &params)); _parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Params), (const gpu::Byte*) &params));
setGaussianFilterTaps(3); setFilterGaussianTaps(3);
} }
void BlurParams::setWidthHeight(int width, int height, bool isStereo) { 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; filterTaps[index].y = value;
} }
void BlurParams::setGaussianFilterTaps(int numHalfTaps, float sigma) { void BlurParams::setFilterGaussianTaps(int numHalfTaps, float sigma) {
auto& params = _parametersBuffer.edit<Params>(); auto& params = _parametersBuffer.edit<Params>();
const int numTaps = 2 * numHalfTaps + 1; const int numTaps = 2 * numHalfTaps + 1;
assert(numTaps <= BLUR_MAX_NUM_TAPS); 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. // 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<Params>().filterInfo;
if (value != filterInfo.z) {
_parametersBuffer.edit<Params>().filterInfo.z = value;
}
}
void BlurParams::setDepthPerspective(float oneOverTan2FOV) { void BlurParams::setDepthPerspective(float oneOverTan2FOV) {
auto depthInfo = _parametersBuffer.get<Params>().depthInfo; auto depthInfo = _parametersBuffer.get<Params>().depthInfo;
if (oneOverTan2FOV != depthInfo.w) { if (oneOverTan2FOV != depthInfo.w) {
@ -238,7 +246,13 @@ gpu::PipelinePointer BlurGaussian::getBlurHPipeline() {
} }
void BlurGaussian::configure(const Config& config) { void BlurGaussian::configure(const Config& config) {
auto blurHPipeline = getBlurHPipeline();
_parameters->setFilterRadiusScale(config.filterScale); _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; RenderArgs* args = renderContext->args;
BlurInOutResource::Resources blurringResources; BlurInOutResource::Resources blurringResources;
if (!_inOutResources.updateResources(sourceFramebuffer, blurringResources)) { if (!_inOutResources.updateResources(sourceFramebuffer, blurringResources)) {
// early exit if no valid blurring resources // early exit if no valid blurring resources

View file

@ -30,7 +30,8 @@ public:
void setFilterNumTaps(int count); void setFilterNumTaps(int count);
// Tap 0 is considered the center of the kernel // Tap 0 is considered the center of the kernel
void setFilterTap(int index, float offset, float value); 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 setDepthPerspective(float oneOverTan2FOV);
void setDepthThreshold(float threshold); 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 // 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 }; 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 }; glm::vec4 filterInfo{ 1.0f, 0.0f, 0.0f, 0.0f };
// Depth info (radius scale // Depth info (radius scale
@ -93,12 +94,15 @@ public:
class BlurGaussianConfig : public Job::Config { class BlurGaussianConfig : public Job::Config {
Q_OBJECT Q_OBJECT
Q_PROPERTY(bool enabled WRITE setEnabled READ isEnabled NOTIFY dirty) // expose enabled flag 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: public:
BlurGaussianConfig() : Job::Config(true) {} BlurGaussianConfig() : Job::Config(true) {}
float filterScale{ 0.2f }; float filterScale{ 0.2f };
float mix{ 1.0f };
signals : signals :
void dirty(); void dirty();

View file

@ -41,7 +41,7 @@ int getFilterNumTaps() {
return int(parameters.filterInfo.y); return int(parameters.filterInfo.y);
} }
float getFilterMix() { float getOutputAlpha() {
return parameters.filterInfo.z; return parameters.filterInfo.z;
} }
@ -102,6 +102,7 @@ vec4 pixelShaderGaussian(vec2 texcoord, vec2 direction, vec2 pixelStep) {
if (totalWeight>0.0) { if (totalWeight>0.0) {
srcBlurred /= totalWeight; srcBlurred /= totalWeight;
} }
srcBlurred.a = getOutputAlpha();
return srcBlurred; return srcBlurred;
} }