mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-12-28 18:41:14 +00:00
examples: Add Pixelation filter shader (#418)
This commit is contained in:
parent
662a858ab6
commit
a7eac490d5
1 changed files with 127 additions and 0 deletions
127
data/examples/shaders/filter/pixelation.effect
Normal file
127
data/examples/shaders/filter/pixelation.effect
Normal 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);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue