Tweaked bloom intensity mix

This commit is contained in:
Olivier Prat 2018-04-10 11:13:37 +02:00
parent 3c4409c5e1
commit 2974e05cf2
8 changed files with 29 additions and 21 deletions

View file

@ -336,7 +336,7 @@ void Antialiasing::run(const render::RenderContextPointer& renderContext, const
auto& antiAliasingBuffer = _antialiasingBuffers->edit(i); auto& antiAliasingBuffer = _antialiasingBuffers->edit(i);
antiAliasingBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing")); antiAliasingBuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("antialiasing"));
auto format = sourceBuffer->getRenderBuffer(0)->getTexelFormat(); auto format = sourceBuffer->getRenderBuffer(0)->getTexelFormat();
auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR); auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR, gpu::Sampler::WRAP_CLAMP);
_antialiasingTextures[i] = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler); _antialiasingTextures[i] = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, defaultSampler);
antiAliasingBuffer->setRenderBuffer(0, _antialiasingTextures[i]); antiAliasingBuffer->setRenderBuffer(0, _antialiasingTextures[i]);
} }

View file

@ -13,7 +13,7 @@
uniform sampler2D blurMap0; uniform sampler2D blurMap0;
uniform sampler2D blurMap1; uniform sampler2D blurMap1;
uniform sampler2D blurMap2; uniform sampler2D blurMap2;
uniform float intensity; uniform vec3 intensity;
in vec2 varTexCoord0; in vec2 varTexCoord0;
out vec4 outFragColor; out vec4 outFragColor;
@ -23,5 +23,5 @@ void main(void) {
vec4 blur1 = texture(blurMap1, varTexCoord0); vec4 blur1 = texture(blurMap1, varTexCoord0);
vec4 blur2 = texture(blurMap2, varTexCoord0); vec4 blur2 = texture(blurMap2, varTexCoord0);
outFragColor = vec4((blur0.rgb+blur1.rgb+blur2.rgb)*intensity, 1.0f); outFragColor = vec4(blur0.rgb*intensity.x+blur1.rgb*intensity.y+blur2.rgb*intensity.z, 1.0f);
} }

View file

@ -50,7 +50,7 @@ void BloomThreshold::run(const render::RenderContextPointer& renderContext, cons
if (!_outputBuffer || _outputBuffer->getSize() != bufferSize) { if (!_outputBuffer || _outputBuffer->getSize() != bufferSize) {
auto colorTexture = gpu::TexturePointer(gpu::Texture::createRenderBuffer(inputBuffer->getTexelFormat(), bufferSize.x, bufferSize.y, 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::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->setRenderBuffer(0, colorTexture); _outputBuffer->setRenderBuffer(0, colorTexture);
@ -93,12 +93,15 @@ void BloomThreshold::run(const render::RenderContextPointer& renderContext, cons
outputs = _outputBuffer; outputs = _outputBuffer;
} }
BloomApply::BloomApply() { BloomApply::BloomApply() : _intensities{ 1.0f, 1.0f, 1.0f } {
} }
void BloomApply::configure(const Config& config) { void BloomApply::configure(const Config& config) {
_intensity = config.intensity; _intensities.x = 2.0f * M_PI * config.sigma * config.sigma;
_intensities.y = _intensities.x*_intensities.x;
_intensities.z = _intensities.y*_intensities.x;
_intensities *= config.intensity / 3.0f;
} }
void BloomApply::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { void BloomApply::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) {
@ -149,7 +152,7 @@ void BloomApply::run(const render::RenderContextPointer& renderContext, const In
batch.setResourceTexture(BLUR0_SLOT, blur0FB->getRenderBuffer(0)); batch.setResourceTexture(BLUR0_SLOT, blur0FB->getRenderBuffer(0));
batch.setResourceTexture(BLUR1_SLOT, blur1FB->getRenderBuffer(0)); batch.setResourceTexture(BLUR1_SLOT, blur1FB->getRenderBuffer(0));
batch.setResourceTexture(BLUR2_SLOT, blur2FB->getRenderBuffer(0)); batch.setResourceTexture(BLUR2_SLOT, blur2FB->getRenderBuffer(0));
batch._glUniform1f(INTENSITY_SLOT, _intensity / 3.0f); batch._glUniform3f(INTENSITY_SLOT, _intensities.x, _intensities.y, _intensities.z);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
}); });
} }
@ -306,19 +309,19 @@ float BloomConfig::getIntensity() const {
void BloomConfig::setSize(float value) { void BloomConfig::setSize(float value) {
std::string blurName{ "BloomBlurN" }; std::string blurName{ "BloomBlurN" };
auto sigma = 0.5f+value*3.5f; auto sigma = 0.5f+value*3.5f;
auto task = static_cast<render::Task::TaskConcept*>(_task);
for (auto i = 0; i < BLOOM_BLUR_LEVEL_COUNT; i++) { for (auto i = 0; i < BLOOM_BLUR_LEVEL_COUNT; i++) {
blurName.back() = '0' + i; blurName.back() = '0' + i;
auto task = static_cast<render::Task::TaskConcept*>(_task);
auto blurJobIt = task->editJob(blurName); auto blurJobIt = task->editJob(blurName);
assert(blurJobIt != task->_jobs.end()); assert(blurJobIt != task->_jobs.end());
auto& gaussianBlur = blurJobIt->edit<render::BlurGaussian>(); auto& gaussianBlur = blurJobIt->edit<render::BlurGaussian>();
auto gaussianBlurParams = gaussianBlur.getParameters(); auto gaussianBlurParams = gaussianBlur.getParameters();
gaussianBlurParams->setFilterGaussianTaps(5, sigma); gaussianBlurParams->setFilterGaussianTaps(5, sigma);
// Gaussian blur increases at each level to have a slower rolloff on the edge
// of the response
sigma *= 1.5f;
} }
auto blurJobIt = task->getJob("BloomApply");
assert(blurJobIt != task->_jobs.end());
blurJobIt->getConfiguration()->setProperty("sigma", sigma);
} }
Bloom::Bloom() { Bloom::Bloom() {
@ -350,7 +353,7 @@ void Bloom::build(JobModel& task, const render::Varying& inputs, render::Varying
// Mix all blur levels at quarter resolution // Mix all blur levels at quarter resolution
const auto applyInput = BloomApply::Inputs(bloomInputBuffer, blurFB0, blurFB1, blurFB2).asVarying(); const auto applyInput = BloomApply::Inputs(bloomInputBuffer, blurFB0, blurFB1, blurFB2).asVarying();
task.addJob<BloomApply>("BloomApply", applyInput); task.addJob<BloomApply>("BloomApply", applyInput);
// And them blend result in additive manner on top of final color buffer // And then blend result in additive manner on top of final color buffer
const auto drawInput = BloomDraw::Inputs(frameBuffer, bloomInputBuffer).asVarying(); const auto drawInput = BloomDraw::Inputs(frameBuffer, bloomInputBuffer).asVarying();
task.addJob<BloomDraw>("BloomDraw", drawInput); task.addJob<BloomDraw>("BloomDraw", drawInput);

View file

@ -25,7 +25,7 @@ public:
BloomConfig() : render::Task::Config(false) {} BloomConfig() : render::Task::Config(false) {}
float size{ 0.3f }; float size{ 0.65f };
void setIntensity(float value); void setIntensity(float value);
float getIntensity() const; float getIntensity() const;
@ -41,7 +41,7 @@ class BloomThresholdConfig : public render::Job::Config {
public: public:
float threshold{ 0.3f }; float threshold{ 0.9f };
signals: signals:
void dirty(); void dirty();
@ -71,10 +71,12 @@ private:
class BloomApplyConfig : public render::Job::Config { class BloomApplyConfig : public render::Job::Config {
Q_OBJECT Q_OBJECT
Q_PROPERTY(float intensity MEMBER intensity NOTIFY dirty) Q_PROPERTY(float intensity MEMBER intensity NOTIFY dirty)
Q_PROPERTY(float sigma MEMBER sigma NOTIFY dirty)
public: public:
float intensity{ 0.2f }; float intensity{ 0.25f };
float sigma{ 1.0f };
signals: signals:
void dirty(); void dirty();
@ -94,7 +96,7 @@ public:
private: private:
gpu::PipelinePointer _pipeline; gpu::PipelinePointer _pipeline;
float _intensity{ 1.0f }; glm::vec3 _intensities;
}; };
class BloomDraw { class BloomDraw {

View file

@ -190,7 +190,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren
const auto toneAndPostRangeTimer = task.addJob<BeginGPURangeTimer>("BeginToneAndPostRangeTimer", "PostToneOverlaysAntialiasing"); const auto toneAndPostRangeTimer = task.addJob<BeginGPURangeTimer>("BeginToneAndPostRangeTimer", "PostToneOverlaysAntialiasing");
// AA job // AA job before bloom to limit flickering
const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, lightingFramebuffer, linearDepthTarget, velocityBuffer).asVarying(); const auto antialiasingInputs = Antialiasing::Inputs(deferredFrameTransform, lightingFramebuffer, linearDepthTarget, velocityBuffer).asVarying();
task.addJob<Antialiasing>("Antialiasing", antialiasingInputs); task.addJob<Antialiasing>("Antialiasing", antialiasingInputs);

View file

@ -163,7 +163,7 @@ bool BlurInOutResource::updateResources(const gpu::FramebufferPointer& sourceFra
//if (sourceFramebuffer->hasDepthStencil()) { //if (sourceFramebuffer->hasDepthStencil()) {
// _blurredFramebuffer->setDepthStencilBuffer(sourceFramebuffer->getDepthStencilBuffer(), sourceFramebuffer->getDepthStencilBufferFormat()); // _blurredFramebuffer->setDepthStencilBuffer(sourceFramebuffer->getDepthStencilBuffer(), sourceFramebuffer->getDepthStencilBufferFormat());
//} //}
auto blurringSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT); auto blurringSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT, gpu::Sampler::WRAP_CLAMP);
auto blurringTarget = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), blurBufferSize.x, blurBufferSize.y, gpu::Texture::SINGLE_MIP, blurringSampler); auto blurringTarget = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), blurBufferSize.x, blurBufferSize.y, gpu::Texture::SINGLE_MIP, blurringSampler);
_blurredFramebuffer->setRenderBuffer(0, blurringTarget); _blurredFramebuffer->setRenderBuffer(0, blurringTarget);
} }
@ -186,7 +186,7 @@ bool BlurInOutResource::updateResources(const gpu::FramebufferPointer& sourceFra
/* if (sourceFramebuffer->hasDepthStencil()) { /* if (sourceFramebuffer->hasDepthStencil()) {
_outputFramebuffer->setDepthStencilBuffer(sourceFramebuffer->getDepthStencilBuffer(), sourceFramebuffer->getDepthStencilBufferFormat()); _outputFramebuffer->setDepthStencilBuffer(sourceFramebuffer->getDepthStencilBuffer(), sourceFramebuffer->getDepthStencilBufferFormat());
}*/ }*/
auto blurringSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT); auto blurringSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT, gpu::Sampler::WRAP_CLAMP);
auto blurringTarget = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), blurBufferSize.x, blurBufferSize.y, gpu::Texture::SINGLE_MIP, blurringSampler); auto blurringTarget = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), blurBufferSize.x, blurBufferSize.y, gpu::Texture::SINGLE_MIP, blurringSampler);
_outputFramebuffer->setRenderBuffer(0, blurringTarget); _outputFramebuffer->setRenderBuffer(0, blurringTarget);
} }

View file

@ -93,9 +93,10 @@ Item {
integral: false integral: false
config: root.config config: root.config
property: "intensity" property: "intensity"
max: 5.0 max: 1.0
min: 0.0 min: 0.0
width: 280 width: 280
height:38
} }
ConfigSlider { ConfigSlider {
label: "Size" label: "Size"
@ -105,6 +106,7 @@ Item {
max: 1.0 max: 1.0
min: 0.0 min: 0.0
width: 280 width: 280
height:38
} }
ConfigSlider { ConfigSlider {
label: "Threshold" label: "Threshold"
@ -114,6 +116,7 @@ Item {
max: 2.0 max: 2.0
min: 0.0 min: 0.0
width: 280 width: 280
height:38
} }
} }
} }

View file

@ -15,6 +15,6 @@ var window = new OverlayWindow({
title: 'Bloom', title: 'Bloom',
source: qml, source: qml,
width: 285, width: 285,
height: 170, height: 210,
}); });
window.closed.connect(function() { Script.stop(); }); window.closed.connect(function() { Script.stop(); });