From 733b325f985c0f0fa076cc30148b25708c2e2174 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Tue, 8 Jun 2021 06:39:29 +0200 Subject: [PATCH] gfx/blur/dual-filtering: Clean up code Cleans up the code slightly, without affecting actual functionality --- data/effects/blur/common.effect | 1 - data/effects/blur/dual-filtering.effect | 29 ++++++------- source/gfx/blur/gfx-blur-dual-filtering.cpp | 47 +++++++++------------ source/gfx/blur/gfx-blur-dual-filtering.hpp | 2 +- 4 files changed, 35 insertions(+), 44 deletions(-) diff --git a/data/effects/blur/common.effect b/data/effects/blur/common.effect index dda51cc..f1a5998 100644 --- a/data/effects/blur/common.effect +++ b/data/effects/blur/common.effect @@ -37,7 +37,6 @@ uniform float4x4 ViewProj; uniform texture2d pImage; uniform float2 pImageSize; uniform float2 pImageTexel; -uniform float2 pImageHalfTexel; uniform float pSize; uniform float pSizeInverseMul; uniform float pAngle; diff --git a/data/effects/blur/dual-filtering.effect b/data/effects/blur/dual-filtering.effect index bd53773..5371d18 100644 --- a/data/effects/blur/dual-filtering.effect +++ b/data/effects/blur/dual-filtering.effect @@ -4,15 +4,14 @@ // Technique: Down //------------------------------------------------------------------------------ float4 PSDown(VertexInformation vtx) : TARGET { - //vtx.uv = ((floor(vtx.uv * pImageSize) + float2(0.5, 0.5)) * pImageTexel); - float4 pxCC = pImage.Sample(LinearClampSampler, vtx.uv) * 4.0; - float4 pxTL = pImage.Sample(LinearClampSampler, vtx.uv - pImageHalfTexel); - float4 pxTR = pImage.Sample(LinearClampSampler, vtx.uv + pImageHalfTexel); - float4 pxBL = pImage.Sample(LinearClampSampler, vtx.uv + float2(pImageHalfTexel.x, -pImageHalfTexel.y)); - float4 pxBR = pImage.Sample(LinearClampSampler, vtx.uv - float2(pImageHalfTexel.x, -pImageHalfTexel.y)); + float4 pxTL = pImage.Sample(LinearClampSampler, vtx.uv - pImageTexel.xy); + float4 pxTR = pImage.Sample(LinearClampSampler, vtx.uv + pImageTexel.xy); + float4 pxBL = pImage.Sample(LinearClampSampler, vtx.uv + float2(pImageTexel.x, -pImageTexel.y)); + float4 pxBR = pImage.Sample(LinearClampSampler, vtx.uv - float2(pImageTexel.x, -pImageTexel.y)); return (pxCC + pxTL + pxTR + pxBL + pxBR) * 0.125; + // return (pxCC + pxTL + pxTR + pxBL + pxBR) / 8; } technique Down { @@ -26,16 +25,14 @@ technique Down { // Technique: Up //------------------------------------------------------------------------------ float4 PSUp(VertexInformation vtx) : TARGET { - //vtx.uv = ((floor(vtx.uv * pImageSize) + float2(0.5, 0.5)) * pImageTexel); - - float4 pxL = pImage.Sample(LinearClampSampler, vtx.uv - float2(pImageHalfTexel.x * 2.0, 0.)); - float4 pxBL = pImage.Sample(LinearClampSampler, vtx.uv - float2(pImageHalfTexel.x, -pImageHalfTexel.y)); - float4 pxB = pImage.Sample(LinearClampSampler, vtx.uv + float2(0., pImageHalfTexel.y * 2.0)); - float4 pxBR = pImage.Sample(LinearClampSampler, vtx.uv + pImageHalfTexel); - float4 pxR = pImage.Sample(LinearClampSampler, vtx.uv + float2(pImageHalfTexel.x * 2.0, 0.)); - float4 pxTR = pImage.Sample(LinearClampSampler, vtx.uv + float2(pImageHalfTexel.x, -pImageHalfTexel.y)); - float4 pxT = pImage.Sample(LinearClampSampler, vtx.uv - float2(0., pImageHalfTexel.y * 2.0)); - float4 pxTL = pImage.Sample(LinearClampSampler, vtx.uv - pImageHalfTexel); + float4 pxL = pImage.Sample(LinearClampSampler, vtx.uv + float2(-pImageTexel.x * 2, 0. )); + float4 pxBL = pImage.Sample(LinearClampSampler, vtx.uv + float2(-pImageTexel.x, pImageTexel.y)); // * 2.0 + float4 pxB = pImage.Sample(LinearClampSampler, vtx.uv + float2( 0., pImageTexel.y * 2)); + float4 pxBR = pImage.Sample(LinearClampSampler, vtx.uv + float2( pImageTexel.x, pImageTexel.y)); // * 2.0 + float4 pxR = pImage.Sample(LinearClampSampler, vtx.uv + float2( pImageTexel.x * 2, 0. )); + float4 pxTR = pImage.Sample(LinearClampSampler, vtx.uv + float2( pImageTexel.x, -pImageTexel.y)); // * 2.0 + float4 pxT = pImage.Sample(LinearClampSampler, vtx.uv + float2( 0., -pImageTexel.y * 2)); + float4 pxTL = pImage.Sample(LinearClampSampler, vtx.uv + float2(-pImageTexel.x, -pImageTexel.y)); // * 2.0 return (((pxTL + pxTR + pxBL + pxBR) * 2.0) + pxL + pxR + pxT + pxB) * 0.083333333333; // return (((pxTL + pxTR + pxBL + pxBR) * 2.0) + pxL + pxR + pxT + pxB) / 12; diff --git a/source/gfx/blur/gfx-blur-dual-filtering.cpp b/source/gfx/blur/gfx-blur-dual-filtering.cpp index 945f91c..fdfe4f4 100644 --- a/source/gfx/blur/gfx-blur-dual-filtering.cpp +++ b/source/gfx/blur/gfx-blur-dual-filtering.cpp @@ -16,6 +16,7 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA #include "gfx-blur-dual-filtering.hpp" +#include #include #include "obs/gs/gs-helper.hpp" #include "plugin.hpp" @@ -180,7 +181,7 @@ std::shared_ptr<::streamfx::gfx::blur::dual_filtering_data> streamfx::gfx::blur: } streamfx::gfx::blur::dual_filtering::dual_filtering() - : _data(::streamfx::gfx::blur::dual_filtering_factory::get().data()), _size(0), _size_iterations(0) + : _data(::streamfx::gfx::blur::dual_filtering_factory::get().data()), _size(0), _iterations(0) { auto gctx = streamfx::obs::gs::context(); _rts.resize(ST_MAX_LEVELS + 1); @@ -214,11 +215,8 @@ double_t streamfx::gfx::blur::dual_filtering::get_size() void streamfx::gfx::blur::dual_filtering::set_size(double_t width) { - _size = width; - _size_iterations = size_t(round(width)); - if (_size_iterations >= ST_MAX_LEVELS) { - _size_iterations = ST_MAX_LEVELS; - } + _size = width; + _iterations = std::clamp(static_cast(round(width)), 0, ST_MAX_LEVELS); } void streamfx::gfx::blur::dual_filtering::set_step_scale(double_t, double_t) {} @@ -238,8 +236,6 @@ std::shared_ptr<::streamfx::obs::gs::texture> streamfx::gfx::blur::dual_filterin return _input_texture; } - std::size_t actual_iterations = _size_iterations; - gs_blend_state_push(); gs_reset_blend_state(); gs_enable_color(true, true, true, true); @@ -253,36 +249,36 @@ std::shared_ptr<::streamfx::obs::gs::texture> streamfx::gfx::blur::dual_filterin gs_stencil_function(GS_STENCIL_BOTH, GS_ALWAYS); gs_stencil_op(GS_STENCIL_BOTH, GS_ZERO, GS_ZERO, GS_ZERO); - uint32_t width = _input_texture->get_width(); - uint32_t height = _input_texture->get_height(); + uint32_t width = _input_texture->get_width(); + uint32_t height = _input_texture->get_height(); + size_t iterations = _iterations; // Downsample - for (std::size_t n = 1; n <= actual_iterations; n++) { + for (std::size_t n = 1; n <= iterations; n++) { #ifdef ENABLE_PROFILING auto gdm = streamfx::obs::gs::debug_marker(streamfx::obs::gs::debug_color_azure_radiance, "Down %" PRIuMAX, n); #endif // Select Texture - std::shared_ptr tex_cur; + std::shared_ptr tex; if (n > 1) { - tex_cur = _rts[n - 1]->get_texture(); + tex = _rts[n - 1]->get_texture(); } else { // Idx 0 is a simply considered as a straight copy of the original and not rendered to. - tex_cur = _input_texture; + tex = _input_texture; } // Reduce Size uint32_t owidth = width >> n; uint32_t oheight = height >> n; - if ((owidth <= 0) || (oheight <= 0)) { - actual_iterations = n - 1; + if ((owidth == 0) || (oheight == 0)) { + iterations = n - 1; break; } // Apply - effect.get_parameter("pImage").set_texture(tex_cur); + effect.get_parameter("pImage").set_texture(tex); effect.get_parameter("pImageSize").set_float2(float_t(owidth), float_t(oheight)); - effect.get_parameter("pImageTexel").set_float2(1.0f / owidth, 1.0f / oheight); - effect.get_parameter("pImageHalfTexel").set_float2(0.5f / owidth, 0.5f / oheight); + effect.get_parameter("pImageTexel").set_float2(0.5f / owidth, 0.5f / oheight); { auto op = _rts[n]->render(owidth, oheight); @@ -294,25 +290,24 @@ std::shared_ptr<::streamfx::obs::gs::texture> streamfx::gfx::blur::dual_filterin } // Upsample - for (std::size_t n = actual_iterations; n > 0; n--) { + for (std::size_t n = iterations; n > 0; n--) { #ifdef ENABLE_PROFILING auto gdm = streamfx::obs::gs::debug_marker(streamfx::obs::gs::debug_color_azure_radiance, "Up %" PRIuMAX, n); #endif // Select Texture - std::shared_ptr tex_in = _rts[n]->get_texture(); + std::shared_ptr tex = _rts[n]->get_texture(); // Get Size - uint32_t iwidth = width >> n; - uint32_t iheight = height >> n; + uint32_t iwidth = tex->get_width(); + uint32_t iheight = tex->get_height(); uint32_t owidth = width >> (n - 1); uint32_t oheight = height >> (n - 1); // Apply - effect.get_parameter("pImage").set_texture(tex_in); + effect.get_parameter("pImage").set_texture(tex); effect.get_parameter("pImageSize").set_float2(float_t(iwidth), float_t(iheight)); - effect.get_parameter("pImageTexel").set_float2(1.0f / iwidth, 1.0f / iheight); - effect.get_parameter("pImageHalfTexel").set_float2(0.5f / iwidth, 0.5f / iheight); + effect.get_parameter("pImageTexel").set_float2(0.5f / iwidth, 0.5f / iheight); { auto op = _rts[n - 1]->render(owidth, oheight); diff --git a/source/gfx/blur/gfx-blur-dual-filtering.hpp b/source/gfx/blur/gfx-blur-dual-filtering.hpp index 70c9dfd..d594868 100644 --- a/source/gfx/blur/gfx-blur-dual-filtering.hpp +++ b/source/gfx/blur/gfx-blur-dual-filtering.hpp @@ -84,7 +84,7 @@ namespace streamfx::gfx { std::shared_ptr<::streamfx::gfx::blur::dual_filtering_data> _data; double_t _size; - std::size_t _size_iterations; + std::size_t _iterations; std::shared_ptr _input_texture;