From 999362b5f904e61082d3e8beedad78cc548be257 Mon Sep 17 00:00:00 2001 From: kilin Date: Sat, 6 Feb 2021 21:18:05 +0900 Subject: [PATCH] examples: Add Pixelation filter shader (#418) --- .../examples/shaders/filter/pixelation.effect | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 data/examples/shaders/filter/pixelation.effect diff --git a/data/examples/shaders/filter/pixelation.effect b/data/examples/shaders/filter/pixelation.effect new file mode 100644 index 00000000..5d3f42d6 --- /dev/null +++ b/data/examples/shaders/filter/pixelation.effect @@ -0,0 +1,127 @@ +// Always provided by OBS +uniform float4x4 ViewProj< + bool automatic = true; + string name = "View Projection Matrix"; +>; +// Provided by Stream Effects +uniform float4 ViewSize< + bool automatic = true; +>; +uniform texture2d InputA< + bool automatic = true; +>; + +uniform float PixelScale< + string name = "Scale"; + string field_type = "slider"; + float minimum = 1.0; + float maximum = 1024.0; + float step = 1.0; +> = 120.0; +uniform float Range_EndXOffset< + string name = "Range End X"; + string field_type = "slider"; + float minimum = 0.0; + float maximum = 100.0; + float step = 1.0; + float scale = 1.0; +> = 100; +uniform float Range_EndYOffset< + string name = "Range End Y"; + string field_type = "slider"; + float minimum = 0.0; + float maximum = 100.0; + float step = 1.0; + float scale = 1.0; +> = 100; +uniform float Range_StartXOffset< + string name = "Range Start X"; + string field_type = "slider"; + float minimum = 0.0; + float maximum = 100.0; + float step = 1.0; + float scale = 1.0; +> = 0; +uniform float Range_StartYOffset< + string name = "Range Start Y"; + string field_type = "slider"; + float minimum = 0.0; + float maximum = 100.0; + float step = 1.0; + float scale = 1.0; +> = 0; + +// ---------- Shader Code +sampler_state def_sampler { + AddressU = Clamp; + AddressV = Clamp; + Filter = Linear; +}; + +struct VertData { + float4 pos : POSITION; + float2 uv : TEXCOORD0; +}; + +VertData VSDefault(VertData v_in) { + VertData vert_out; + vert_out.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj); + vert_out.uv = v_in.uv; + return vert_out; +} + +#define PI 3.1415926f +#define TAU 6.2831853f +#define deg30 0.52359877 + +float2 nearestPixel(float s, float2 st){ + float h = sin(deg30)*s; + float r = cos(deg30)*s; + + float2 sect = st/float2(2.0*r, h+s); + float2 sectPxl = fmod(st, float2(2.0*r, h+s)); + + float aSection = fmod(floor(sect.y), 2.0); + + float2 coord = floor(sect); + + float xoff = fmod(coord.y, 2.0)*r; + return float2(coord.x*2.0*r-xoff, coord.y*(h+s))+float2(r*2.0, s); +} + +float4 PSDefault(VertData v_in) : TARGET { + float2 coord = v_in.uv * ViewSize.xy; + float s = ViewSize.x/PixelScale; + float2 nearest = nearestPixel(s, coord); + float4 texel = InputA.Sample(def_sampler, nearest / ViewSize.xy);//, -100.0); + + //** + float End_X_Offset = Range_EndXOffset/100; + float Start_X_Offset = Range_StartXOffset/100; + float End_Y_Offset = Range_EndYOffset/100; + float Start_Y_Offset = Range_StartYOffset/100; + + float luminance = (texel.r + texel.g + texel.b)/3.0; + float interiorSize = s; + float interior = 1.0 - smoothstep(interiorSize-1.0, interiorSize, 1); + + //** + float4 c1; + c1 = InputA.Sample(def_sampler, v_in.uv); + if ((v_in.uv.x < (End_X_Offset - 0.005)) && (v_in.uv.x > (Start_X_Offset - 0.005)) && + (v_in.uv.y < (End_Y_Offset - 0.005)) && (v_in.uv.y > (Start_Y_Offset - 0.005))) + { + c1 = float4(texel.rgb*interior, 1.0); + } + return c1; + //fragColor = float4(nearest, 0.0, 1.0); +} + +technique Draw +{ + pass + { + vertex_shader = VSDefault(v_in); + pixel_shader = PSDefault(v_in); + } +}