Three blurs working

This commit is contained in:
Olivier Prat 2017-10-09 15:13:32 +02:00
parent 0d3d309bce
commit cda48cbf67
3 changed files with 53 additions and 24 deletions

View file

@ -17,6 +17,8 @@
#include "BloomThreshold_frag.h"
#define BLOOM_BLUR_LEVEL_COUNT 3
ThresholdAndDownsampleJob::ThresholdAndDownsampleJob() {
}
@ -103,8 +105,12 @@ void DebugBloom::run(const render::RenderContextPointer& renderContext, const In
const auto frameBuffer = inputs.get0();
const auto framebufferSize = frameBuffer->getSize();
const auto level0FB = inputs.get1();
const gpu::TexturePointer levelTextures[1] = {
level0FB->getRenderBuffer(0)
const auto level1FB = inputs.get2();
const auto level2FB = inputs.get3();
const gpu::TexturePointer levelTextures[BLOOM_BLUR_LEVEL_COUNT] = {
level0FB->getRenderBuffer(0),
level1FB->getRenderBuffer(0),
level2FB->getRenderBuffer(0)
};
if (!_pipeline) {
@ -128,27 +134,36 @@ void DebugBloom::run(const render::RenderContextPointer& renderContext, const In
batch.setViewportTransform(args->_viewport);
batch.setProjectionTransform(glm::mat4());
batch.resetViewTransform();
batch.setPipeline(_pipeline);
Transform modelTransform = gpu::Framebuffer::evalSubregionTexcoordTransform(framebufferSize, args->_viewport / 2);
modelTransform.postTranslate(glm::vec3(-1.0f, 1.0f, 0.0f));
batch.setModelTransform(modelTransform);
batch.setPipeline(_pipeline);
batch.setResourceTexture(0, levelTextures[0]);
batch.draw(gpu::TRIANGLE_STRIP, 4);
modelTransform.postTranslate(glm::vec3(2.0f, 0.0f, 0.0f));
batch.setModelTransform(modelTransform);
batch.setResourceTexture(0, levelTextures[1]);
batch.draw(gpu::TRIANGLE_STRIP, 4);
modelTransform.postTranslate(glm::vec3(-2.0f, -2.0f, 0.0f));
batch.setModelTransform(modelTransform);
batch.setResourceTexture(0, levelTextures[2]);
batch.draw(gpu::TRIANGLE_STRIP, 4);
});
}
void BloomConfig::setIntensity(float value) {
/* auto blurConfig = getConfig<render::BlurGaussian>();
blurConfig->setProperty("mix", value*0.5f);*/
}
void BloomConfig::setSize(float value) {
/* auto& blurJob = static_cast<render::Task::TaskConcept*>(_task)->_jobs.front();
auto& gaussianBlur = blurJob.edit<render::BlurGaussian>();
auto gaussianBlurParams = gaussianBlur.getParameters();
gaussianBlurParams->setFilterGaussianTaps((BLUR_MAX_NUM_TAPS - 1) / 2, value*7.0f);*/
for (auto i = 0; i < BLOOM_BLUR_LEVEL_COUNT; i++) {
auto& blurJob = static_cast<render::Task::TaskConcept*>(_task)->_jobs[i+1];
auto& gaussianBlur = blurJob.edit<render::BlurGaussian>();
auto gaussianBlurParams = gaussianBlur.getParameters();
gaussianBlurParams->setFilterGaussianTaps((BLUR_MAX_NUM_TAPS - 1) / 2, value*7.0f);
}
}
Bloom::Bloom() {
@ -156,15 +171,25 @@ Bloom::Bloom() {
}
void Bloom::configure(const Config& config) {
/* auto blurConfig = config.getConfig<render::BlurGaussian>();
blurConfig->setProperty("filterScale", 3.0f);*/
std::string blurName{ "BloomBlurN" };
for (auto i = 0; i < BLOOM_BLUR_LEVEL_COUNT; i++) {
blurName.back() = '0' + i;
auto blurConfig = config.getConfig<render::BlurGaussian>(blurName);
blurConfig->setProperty("filterScale", 3.0f);
}
}
void Bloom::build(JobModel& task, const render::Varying& inputs, render::Varying& outputs) {
const auto halfSizeBuffer = task.addJob<ThresholdAndDownsampleJob>("BloomThreshold", inputs);
const auto bloomInputBuffer = task.addJob<ThresholdAndDownsampleJob>("BloomThreshold", inputs);
// Level 0 blur
const auto blurFB0 = task.addJob<render::BlurGaussian>("BloomBlur0", bloomInputBuffer);
const auto blurFB1 = task.addJob<render::BlurGaussian>("BloomBlur1", blurFB0, true);
const auto blurFB2 = task.addJob<render::BlurGaussian>("BloomBlur2", blurFB1, true);
const auto& input = inputs.get<Inputs>();
const auto& frameBuffer = input[1];
const auto debugInput = DebugBloom::Inputs(frameBuffer, halfSizeBuffer).asVarying();
const auto debugInput = DebugBloom::Inputs(frameBuffer, blurFB0, blurFB1, blurFB2).asVarying();
task.addJob<DebugBloom>("DebugBloom", debugInput);
}

View file

@ -77,7 +77,7 @@ public:
class DebugBloom {
public:
using Inputs = render::VaryingSet2<gpu::FramebufferPointer, gpu::FramebufferPointer>;
using Inputs = render::VaryingSet4<gpu::FramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
using Config = DebugBloomConfig;
using JobModel = render::Job::ModelI<DebugBloom, Inputs, Config>;

View file

@ -181,7 +181,7 @@ bool BlurInOutResource::updateResources(const gpu::FramebufferPointer& sourceFra
_outputFramebuffer->setDepthStencilBuffer(sourceFramebuffer->getDepthStencilBuffer(), sourceFramebuffer->getDepthStencilBufferFormat());
}*/
auto blurringSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT);
auto blurringTarget = gpu::Texture::create2D(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), sourceFramebuffer->getWidth(), sourceFramebuffer->getHeight(), gpu::Texture::SINGLE_MIP, blurringSampler);
auto blurringTarget = gpu::Texture::createRenderBuffer(sourceFramebuffer->getRenderBuffer(0)->getTexelFormat(), sourceFramebuffer->getWidth(), sourceFramebuffer->getHeight(), gpu::Texture::SINGLE_MIP, blurringSampler);
_outputFramebuffer->setRenderBuffer(0, blurringTarget);
}
@ -246,13 +246,16 @@ gpu::PipelinePointer BlurGaussian::getBlurHPipeline() {
}
void BlurGaussian::configure(const Config& config) {
auto blurHPipeline = getBlurHPipeline();
auto state = getBlurHPipeline()->getState();
_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);
if (config.mix < 1.0f) {
state->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);
} else {
state->setBlendFunction(false);
}
}
@ -271,14 +274,15 @@ void BlurGaussian::run(const RenderContextPointer& renderContext, const gpu::Fra
auto blurVPipeline = getBlurVPipeline();
auto blurHPipeline = getBlurHPipeline();
glm::ivec4 viewport = { 0, 0, blurredFramebuffer->getWidth(), blurredFramebuffer->getHeight() };
_parameters->setWidthHeight(args->_viewport.z, args->_viewport.w, args->isStereo());
_parameters->setWidthHeight(viewport.z, viewport.w, args->isStereo());
glm::ivec2 textureSize(blurringResources.sourceTexture->getDimensions());
_parameters->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, args->_viewport));
_parameters->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, viewport));
gpu::doInBatch(args->_context, [=](gpu::Batch& batch) {
batch.enableStereo(false);
batch.setViewportTransform(args->_viewport);
batch.setViewportTransform(viewport);
batch.setUniformBuffer(BlurTask_ParamsSlot, _parameters->_parametersBuffer);