obs-StreamFX/data/effects/pack-unpack.effect
2020-03-20 23:09:46 +01:00

139 lines
4.9 KiB
Text

uniform float4x4 ViewProj;
uniform texture2d image;
uniform int size;
sampler_state pixelSampler {
Filter = Point;
AddressU = Clamp;
AddressV = Clamp;
};
struct VertData {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
VertData vertex_program(VertData vd)
{
vd.pos = mul(float4(vd.pos.xyz, 1.0), ViewProj);
return vd;
}
// -------------------------------------------------------------------------------- //
// Helpers
// -------------------------------------------------------------------------------- //
uint get_selector(VertData vd, int width) {
return uint(vd.uv.x * size * width) % width;
}
// -------------------------------------------------------------------------------- //
// Pack/Unpack RG/GR
// -------------------------------------------------------------------------------- //
float4 _PackRG(VertData vd) : TARGET {
if (get_selector(vd, 2) == 0) {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
}
}
technique PackRG { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackRG(vd); } }
float4 _PackGR(VertData vd) : TARGET {
if (get_selector(vd, 2) == 0) {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
}
}
technique PackGR { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackGR(vd); } }
// -------------------------------------------------------------------------------- //
// Pack/Unpack RGB/BGR
// -------------------------------------------------------------------------------- //
float4 _PackRGB(VertData vd) : TARGET {
uint select = get_selector(vd, 3);
if (select == 0) {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).b, 0., 0., 1.);
}
}
technique PackRGB { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackRGB(vd); } }
float4 _PackBGR(VertData vd) : TARGET {
uint select = get_selector(vd, 3);
if (select == 0) {
return float4(image.Sample(pixelSampler, vd.uv).b, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
}
return float4(0., 0., 0., 0.);
}
technique PackBGR { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackBGR(vd); } }
// -------------------------------------------------------------------------------- //
// Pack/Unpack RGBA/ABGR
// -------------------------------------------------------------------------------- //
float4 _PackRGBA(VertData vd) : TARGET {
uint select = get_selector(vd, 4);
if (select == 0) {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
} else if (select == 2) {
return float4(image.Sample(pixelSampler, vd.uv).b, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).a, 0., 0., 1.);
}
}
technique PackRGBA { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackRGBA(vd); } }
float4 _PackABGR(VertData vd) : TARGET {
uint select = get_selector(vd, 4);
if (select == 0) {
return float4(image.Sample(pixelSampler, vd.uv).a, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).b, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
}
}
technique PackABGR { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackABGR(vd); } }
// -------------------------------------------------------------------------------- //
// Pack/Unpack ARGB/BGRA
// -------------------------------------------------------------------------------- //
float4 _PackARGB(VertData vd) : TARGET {
uint select = get_selector(vd, 4);
if (select == 0) {
return float4(image.Sample(pixelSampler, vd.uv).a, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
} else if (select == 2) {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).b, 0., 0., 1.);
}
}
technique PackARGB { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackARGB(vd); } }
float4 _PackBGRA(VertData vd) : TARGET {
uint select = get_selector(vd, 4);
if (select == 0) {
return float4(image.Sample(pixelSampler, vd.uv).b, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).g, 0., 0., 1.);
} else if (select == 1) {
return float4(image.Sample(pixelSampler, vd.uv).r, 0., 0., 1.);
} else {
return float4(image.Sample(pixelSampler, vd.uv).a, 0., 0., 1.);
}
}
technique PackBGRA { pass { vertex_shader = vertex_program(vd); pixel_shader = _PackBGRA(vd); } }