mirror of
https://github.com/JulianGro/overte.git
synced 2025-05-05 14:28:01 +02:00
Tweaked bloom intensity mix
This commit is contained in:
parent
3c4409c5e1
commit
2974e05cf2
8 changed files with 29 additions and 21 deletions
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(); });
|
Loading…
Reference in a new issue