examples: Add Pixelation filter shader (#418)

This commit is contained in:
kilin 2021-02-06 21:18:05 +09:00 committed by Michael Fabian 'Xaymar' Dirks
parent 662a858ab6
commit a7eac490d5

View file

@ -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);
}
}