slang-shaders/bezel/koko-aio/shaders/old_unused/scanline-flickering.slang

104 lines
3.2 KiB
Plaintext
Raw Normal View History

2022-12-06 11:48:10 +11:00
#version 450
#include "config.inc"
#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 in_glow_pass;
layout(set = 0, binding = 3) uniform sampler2D FXAA_pass;
layout(set = 0, binding = 4) uniform sampler2D doublesize_pass;
bool scanline_have_to_flicker(bool is_interlaced) {
return ((scanline_flickering == 1.0) || ((scanline_flickering==2.0) && is_interlaced ));
}
void main()
{
vec3 pixel_out = vec3(0.0);
//Use to debug:
//pixel_out=vec4(abs(sin(params.FrameCount/3.14/20))); //white fade
//pixel_out=vec4(abs(sin(params.FrameCount/3.14/20)),0.0,0.0,0.0); //red fade
//pixel_out=vec4(0.2);
if (DO_SCANLINES == 1.0) {
if (scanline_flickering != 0.0) {
bool is_interlaced = (params.OriginalSize.y > MIN_LINES_INTERLACED) ? true : false ;
if ( scanline_have_to_flicker(is_interlaced) ) {
//Choose the right source
if (DO_IN_GLOW == 1.0) {
pixel_out = texture(in_glow_pass, vTexCoord).rgb;
} else if (DO_FXAA == 1.0) {
pixel_out = texture(FXAA_pass, vTexCoord).rgb;
} else {
pixel_out = texture(doublesize_pass, vTexCoord).rgb;
}
int scanline_period;
int scanline_period_half;
/* Puae switches from lowres to sdres on interlaced screens
since we blindly double the h-resolution, because we need
to double y resolution on low resolution to simulate scanlines
and providing sd-res to fxaa, we can check if a screen is
interlaced by testing v-resolution of source image.
which could be at least 200*2(puae)*2(ourselves)=800px.
Rest assured that everything over 576,
(maximum pal overscanned) is interlaced.
*/
if (is_interlaced) {
scanline_period=4;
scanline_period_half=2;
} else {
scanline_period=2;
scanline_period_half=1;
}
//Skip scanlines on interlaced content?
if (! ( is_interlaced && (scanline_disable_on_interlace == 1.0)) ) {
float mymod = mod(vTexCoord.y * params.OutputSize.y , scanline_period);
//Do flickering based on user prefs.
//(blank odd lines on odd frames and even lines on even frames)
if ((scanline_flickering == 1.0) ||
((scanline_flickering==2.0) && is_interlaced )) {
if (int(mod(float(params.FrameCount),2 )) < 1.0 ) {
if (mymod >= scanline_period_half) { pixel_out *= SCANLINE_DARK; }
} else {
if (mymod < scanline_period_half) { pixel_out *= SCANLINE_DARK; }
}
}
}
}
}
}
FragColor = vec4(pixel_out,1.0);
}