Skip to content

Commit

Permalink
Feature - Adds Dual Kawase Blur filter. (#10)
Browse files Browse the repository at this point in the history
* Adds Interpolated Dual Kawase blur filter, allowing for very high blur radius with extremely efficient computation.
* Improved handling of UI changes between blur algorithms.
  • Loading branch information
FiniteSingularity committed Aug 25, 2023
1 parent 05e6635 commit ea2af49
Show file tree
Hide file tree
Showing 9 changed files with 509 additions and 15 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ target_sources(${PROJECT_NAME} PRIVATE
src/blur/box.h
src/blur/pixelate.c
src/blur/pixelate.h
src/blur/dual_kawase.c
src/blur/dual_kawase.h
src/version.h)

if(BUILD_OUT_OF_TREE)
Expand Down
6 changes: 4 additions & 2 deletions data/locale/en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,18 @@ CompositeBlurFilter.TiltShift.Width="Thickness"
CompositeBlurFilter.TiltShift.Angle="Angle"
CompositeBlurFilter.Algorithm.Gaussian="Gaussian"
CompositeBlurFilter.Algorithm.Box="Box"
CompositeBlurFilter.Algorithm.Kawase="Kawase"
CompositeBlurFilter.Algorithm.DualKawase="Dual Kawase"
CompositeBlurFilter.Algorithm.Pixelate="Pixelate"
CompositeBlurFilter.Type.Area="Area"
CompositeBlurFilter.Type.Directional="Directional"
CompositeBlurFilter.Type.Zoom="Zoom"
CompositeBlurFilter.Type.Motion="Motion"
CompositeBlurFilter.Type.TiltShift="Tilt-Shift"
CompositeBlurFilter.PixelateType="Pixelate Type"
CompositeBlurFilter.Pixelate.PixelSize="Pixel Size"
CompositeBlurFilter.Pixelate.Square="Square"
CompositeBlurFilter.Pixelate.Hexagonal="Hexagonal"
CompositeBlurFilter.Pixelate.Triakis="Triakis"
CompositeBlurFilter.Pixelate.Circle="Circle"
CompositeBlurFilter.Pixelate.Triangle="Triangle"
CompositeBlurFilter.Pixelate.Triangle="Triangle"
CompositeBlurFilter.DualKawase.Passes="Blur Radius"
44 changes: 44 additions & 0 deletions data/shaders/dual_kawase_down_sample.effect
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
uniform float4x4 ViewProj;
uniform texture2d image;
uniform float2 texel_step;

sampler_state textureSampler{
Filter = Linear;
AddressU = Clamp;
AddressV = Clamp;
MinLOD = 0;
MaxLOD = 0;
};

struct VertData {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};

VertData mainTransform(VertData v_in)
{
v_in.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj);
return v_in;
}

float4 mainImage(VertData v_in) : TARGET
{
// Downsample filter as defined here:
// https://blog.en.uwa4d.com/2022/09/06/screen-post-processing-effects-chapter-5-dual-blur-and-its-implementation/
float4 col = image.Sample(textureSampler, v_in.uv);
float4 col_dn_rt = image.Sample(textureSampler, v_in.uv + 0.5f*texel_step);
float4 col_dn_lt = image.Sample(textureSampler, v_in.uv + 0.5f*float2(-texel_step.x, texel_step.y));
float4 col_up_rt = image.Sample(textureSampler, v_in.uv + 0.5f*float2(texel_step.x, -texel_step.y));
float4 col_up_lt = image.Sample(textureSampler, v_in.uv - 0.5f*texel_step);

return (4.0*col + col_dn_rt + col_dn_lt + col_up_rt + col_up_lt)/8.0;
}

technique Draw
{
pass
{
vertex_shader = mainTransform(v_in);
pixel_shader = mainImage(v_in);
}
}
47 changes: 47 additions & 0 deletions data/shaders/dual_kawase_up_sample.effect
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
uniform float4x4 ViewProj;
uniform texture2d image;
uniform float2 texel_step;

sampler_state textureSampler{
Filter = Linear;
AddressU = Clamp;
AddressV = Clamp;
MinLOD = 0;
MaxLOD = 0;
};

struct VertData {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};

VertData mainTransform(VertData v_in)
{
v_in.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj);
return v_in;
}

float4 mainImage(VertData v_in) : TARGET
{
// Upsample filter as defined here:
// https://blog.en.uwa4d.com/2022/09/06/screen-post-processing-effects-chapter-5-dual-blur-and-its-implementation/
float4 col_dn = image.Sample(textureSampler, v_in.uv + float2(0.0f, texel_step.y));
float4 col_up = image.Sample(textureSampler, v_in.uv + float2(0.0f, -texel_step.y));
float4 col_rt = image.Sample(textureSampler, v_in.uv + float2( texel_step.x, 0.0f));
float4 col_lt = image.Sample(textureSampler, v_in.uv + float2(-texel_step.x, 0.0f));
float4 col_dn_rt = image.Sample(textureSampler, v_in.uv + 0.5f*texel_step) * 2.0f;
float4 col_dn_lt = image.Sample(textureSampler, v_in.uv + 0.5f*float2(-texel_step.x, texel_step.y)) * 2.0f;
float4 col_up_rt = image.Sample(textureSampler, v_in.uv + 0.5f*float2( texel_step.x, -texel_step.y)) * 2.0f;
float4 col_up_lt = image.Sample(textureSampler, v_in.uv - 0.5f*texel_step) * 2.0f;

return (col_dn + col_up + col_rt + col_lt + col_dn_rt + col_dn_lt + col_up_rt + col_up_lt)/12.0f;
}

technique Draw
{
pass
{
vertex_shader = mainTransform(v_in);
pixel_shader = mainImage(v_in);
}
}
41 changes: 41 additions & 0 deletions data/shaders/mix.effect
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
uniform float4x4 ViewProj;
uniform texture2d image;
uniform texture2d image2;

uniform float ratio;

sampler_state textureSampler{
Filter = Linear;
AddressU = Clamp;
AddressV = Clamp;
MinLOD = 0;
MaxLOD = 0;
};

struct VertData {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};

VertData mainTransform(VertData v_in)
{
v_in.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj);
return v_in;
}

float4 mainImage(VertData v_in) : TARGET
{
// 1. Sample incoming pixel
float4 c1 = image.Sample(textureSampler, v_in.uv);
float4 c2 = image2.Sample(textureSampler, v_in.uv);
return lerp(c1, c2, float4(ratio, ratio, ratio, ratio));
}

technique Draw
{
pass
{
vertex_shader = mainTransform(v_in);
pixel_shader = mainImage(v_in);
}
}
Loading

0 comments on commit ea2af49

Please sign in to comment.