diff --git a/libraries/render-utils/src/BloomEffect.cpp b/libraries/render-utils/src/BloomEffect.cpp index 6ec20d53c7..e292199bef 100644 --- a/libraries/render-utils/src/BloomEffect.cpp +++ b/libraries/render-utils/src/BloomEffect.cpp @@ -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(); - 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->setFilterGaussianTaps((BLUR_MAX_NUM_TAPS - 1) / 2, value*7.0f);*/ + for (auto i = 0; i < BLOOM_BLUR_LEVEL_COUNT; i++) { + auto& blurJob = static_cast(_task)->_jobs[i+1]; + auto& gaussianBlur = blurJob.edit(); + 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(); - 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(blurName); + blurConfig->setProperty("filterScale", 3.0f); + } } void Bloom::build(JobModel& task, const render::Varying& inputs, render::Varying& outputs) { - const auto halfSizeBuffer = task.addJob("BloomThreshold", inputs); + const auto bloomInputBuffer = task.addJob("BloomThreshold", inputs); + + // Level 0 blur + const auto blurFB0 = task.addJob("BloomBlur0", bloomInputBuffer); + const auto blurFB1 = task.addJob("BloomBlur1", blurFB0, true); + const auto blurFB2 = task.addJob("BloomBlur2", blurFB1, true); + const auto& input = inputs.get(); 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", debugInput); } diff --git a/libraries/render-utils/src/BloomEffect.h b/libraries/render-utils/src/BloomEffect.h index ec14a6ad9f..bd74939ea4 100644 --- a/libraries/render-utils/src/BloomEffect.h +++ b/libraries/render-utils/src/BloomEffect.h @@ -77,7 +77,7 @@ public: class DebugBloom { public: - using Inputs = render::VaryingSet2; + using Inputs = render::VaryingSet4; using Config = DebugBloomConfig; using JobModel = render::Job::ModelI; diff --git a/libraries/render/src/render/BlurTask.cpp b/libraries/render/src/render/BlurTask.cpp index 66f098302d..b42bae3950 100644 --- a/libraries/render/src/render/BlurTask.cpp +++ b/libraries/render/src/render/BlurTask.cpp @@ -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);