diff --git a/misc/bob-and-ghost-deinterlacing.slang b/misc/bob-and-ghost-deinterlacing.slang new file mode 100644 index 0000000..e2c7d14 --- /dev/null +++ b/misc/bob-and-ghost-deinterlacing.slang @@ -0,0 +1,63 @@ +#version 450 + +/* + Bob-and-ghost Deinterlacing + Author: hunterk + License: Public domain + + Note: This shader is designed to work with the typical interlaced output from an emulator, which displays both even and odd fields twice. + As such, it is inappropriate for general video use unless the video has already been similarly woven beforehand. +*/ + +layout(push_constant) uniform Push +{ + vec4 SourceSize; + vec4 OriginalSize; + vec4 OutputSize; + uint FrameCount; +} params; + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; + +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; +} + +#pragma stage fragment +layout(location = 0) in vec2 vTexCoord; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; + +void main() +{ + vec4 current = pow(texture(Source, vTexCoord.xy), vec4(2.2)); + vec4 prev = vec4(0.0); + float y = 0.0; + // assume anything with a vertical resolution greater than 400 lines is interlaced + if (params.SourceSize.y > 400.0){ + y = params.SourceSize.y * vTexCoord.y + params.FrameCount; + current = pow(vec4(texture(Source, vTexCoord + vec2(0.0, params.SourceSize.w))), vec4(2.2)); + vec4 evens = pow(vec4(texture(Source, vTexCoord - vec2(0.0, 0.5 * params.SourceSize.w))), vec4(2.2)); + vec4 odds = pow(vec4(texture(Source, vTexCoord + vec2(0.0, 0.5 * params.SourceSize.w))), vec4(2.2)); + prev = (evens + odds) / 2.0; + } + else + { + y = 2.0 * params.SourceSize.y * vTexCoord.y; + prev = current; + } + + if (mod(y, 2.0) > 0.99999) current = current; + else current = vec4(pow(texture(Source, vTexCoord), vec4(2.2))); + FragColor = vec4(pow((current + prev) / vec4(2.0), vec4(1.0 / 2.2))); +} \ No newline at end of file diff --git a/misc/bob-deinterlacing.slang b/misc/bob-deinterlacing.slang new file mode 100644 index 0000000..72e402e --- /dev/null +++ b/misc/bob-deinterlacing.slang @@ -0,0 +1,51 @@ +#version 450 + +/* + Bob-Deinterlacing + Author: hunterk + License: Public domain + + Note: This shader is designed to work with the typical interlaced output from an emulator, which displays both even and odd fields twice. + As such, it is inappropriate for general video use unless the video has already been similarly woven beforehand. +*/ + +layout(push_constant) uniform Push +{ + vec4 SourceSize; + vec4 OriginalSize; + vec4 OutputSize; + uint FrameCount; +} params; + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; + +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; +} + +#pragma stage fragment +layout(location = 0) in vec2 vTexCoord; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; + +void main() +{ + float y = 0.0; + // assume anything with a vertical resolution greater than 400 lines is interlaced + if (params.SourceSize.y > 400.0) y = params.SourceSize.y * vTexCoord.y + float(params.FrameCount); + else y = 2.0 * params.SourceSize.y * vTexCoord.y; + + if (mod(y, 2.0) > 0.99999) FragColor = vec4(texture(Source, vTexCoord + vec2(0.0, params.SourceSize.w))); + else + FragColor = vec4(texture(Source, vTexCoord).rgb, 1.0); +} \ No newline at end of file diff --git a/misc/cocktail-cabinet.slang b/misc/cocktail-cabinet.slang new file mode 100644 index 0000000..5bcfb2f --- /dev/null +++ b/misc/cocktail-cabinet.slang @@ -0,0 +1,45 @@ +#version 450 + +layout(push_constant) uniform Push +{ + vec4 SourceSize; + vec4 OriginalSize; + vec4 OutputSize; + uint FrameCount; + float height; + float width; + float location; +} params; + +#pragma parameter height "CocktailTable Image Height" 1.0 -3.0 3.0 0.01 +#pragma parameter width "CocktailTable Image Width" 1.0 -3.0 3.0 0.05 +#pragma parameter location "CocktailTable Image Separation" 0.0001 -2.0 2.0 0.001 + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; +layout(location = 1) out vec2 vTexCoord1; + +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = ((TexCoord.xy - vec2(0.5 - (params.location), 0.5)) * mat2x2(0.0, 1.0001 * (params.width), -2.0001 * (params.height), 0.0)) + vec2(0.5, 0. ); + vTexCoord1 = ((TexCoord.xy - vec2(0.5 + (params.location), 0.5)) * mat2x2(0.0, -1.0001 * (params.width), 2.0001 * (params.height), 0.0)) + vec2(0.5, 0. ); +} + +#pragma stage fragment +layout(location = 0) in vec2 vTexCoord; +layout(location = 1) in vec2 vTexCoord1; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; + +void main() +{ + FragColor = vec4(texture(Source, vTexCoord).rgb, 1.0) + vec4(texture(Source, vTexCoord1).rgb, 1.0); +} \ No newline at end of file