diff --git a/dithering/shaders/simple_dither.glsl b/dithering/shaders/simple_dither.glsl new file mode 100644 index 0000000..9a2bde1 --- /dev/null +++ b/dithering/shaders/simple_dither.glsl @@ -0,0 +1,133 @@ +#version 110 + +/* + Simple dither shader by DariusG 2023 + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. +*/ + +#pragma parameter threshold "threshold" 0.2 0.0 3.0 1.0 + +#define iTime float(FrameCount) +#define pi 3.141592 +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float threshold; + +#else +#define threshold 0.1 +#endif + + + +/*blurry dither +vec3 dith = vec3(.0); +float counter = 1.0; +for (int x = -1; x<2; x++) +{ + vec2 uv = vec2(vTexCoord.x*SourceSize.x+float(x), vTexCoord.y*SourceSize.y)/SourceSize.xy; + dith += texture2D(Source,uv).rgb; + counter = counter+1.0; +} + res = (res+dith)/counter; +*/ + +void main() +{ +vec2 pos = vTexCoord; +vec3 res = COMPAT_TEXTURE(Source,pos).rgb; +vec3 left = COMPAT_TEXTURE(Source,pos - vec2(SourceSize.z, 0.0)).rgb; +vec3 right = COMPAT_TEXTURE(Source,pos + vec2(SourceSize.z, 0.0)).rgb; +vec3 lleft = COMPAT_TEXTURE(Source,pos - vec2(SourceSize.z*2.0, 0.0)).rgb; +vec3 rright = COMPAT_TEXTURE(Source,pos + vec2(SourceSize.z*2.0, 0.0)).rgb; + +float leftv = left.r + left.g + left.b; +float rightv = right.r + right.g + right.b; + +if (abs(leftv-rightv) < threshold) res = (res+right)/2.0; + +FragColor = vec4(res,1.0); +} +#endif diff --git a/dithering/simple_dither.glslp b/dithering/simple_dither.glslp new file mode 100644 index 0000000..7a68dc1 --- /dev/null +++ b/dithering/simple_dither.glslp @@ -0,0 +1,5 @@ +shaders = 1_ +shader0 = shaders/simple_dither.glsl +filter_linear0 = false +scale_type0 = source +scale0 = 1.0 diff --git a/ntsc/ntsc-feather.glslp b/ntsc/ntsc-feather.glslp index 1895ce4..6d9898d 100644 --- a/ntsc/ntsc-feather.glslp +++ b/ntsc/ntsc-feather.glslp @@ -1,5 +1,5 @@ shaders = 1 shader0 = shaders/ntsc-simple/ntsc-feather.glsl -filter_linear0 = true -scale_type0 = source \ No newline at end of file +filter_linear0 = false +scale_type0 = source diff --git a/ntsc/shaders/ntsc-simple/ntsc-feather.glsl b/ntsc/shaders/ntsc-simple/ntsc-feather.glsl index b148b36..68a49cc 100644 --- a/ntsc/shaders/ntsc-simple/ntsc-feather.glsl +++ b/ntsc/shaders/ntsc-simple/ntsc-feather.glsl @@ -7,6 +7,9 @@ Software Foundation; either version 2 of the License, or (at your option) any later version. */ + +#define iTime float(FrameCount) +#define pi 3.141592 #if defined(VERTEX) #if __VERSION__ >= 130 @@ -89,104 +92,45 @@ COMPAT_VARYING vec4 TEX0; #define OutSize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM -uniform COMPAT_PRECISION float bleeding; +uniform COMPAT_PRECISION float GLITCH; #else -#define bleeding 0.5 +#define GLITCH 0.1 #endif -#define PI 3.14159265 -#define _Framecount float (FrameCount) +const mat3 rgb2yuv = mat3(0.299,-0.14713, 0.615, + 0.587,-0.28886,-0.51499, + 0.114, 0.436 ,-0.10001); -float RGB2Y(vec3 _rgb) { - return dot(_rgb, vec3(0.29900, 0.58700, 0.11400)); -} +const mat3 yuv2rgb = mat3(1.0, 1.0, 1.0, + 0.0,-0.39465,2.03211, + 1.13983,-0.58060,0.0); -float RGB2U(vec3 _rgb) { - return dot(_rgb, vec3(-0.14713, -0.28886, 0.43600)); -} +void main() +{ +vec2 pos = vTexCoord; -float RGB2V(vec3 _rgb) { - return dot(_rgb, vec3(0.61500, -0.51499, -0.10001)); -} +vec3 res = texture2D(Source,pos).rgb; -float YUV2R(vec3 _yuv) { - return dot(_yuv, vec3(1, 0.00000, 1.13983)); -} +vec3 leftp = COMPAT_TEXTURE(Source,pos-vec2(SourceSize.z,0.0)).rgb; +vec3 rightp = COMPAT_TEXTURE(Source,pos+vec2(SourceSize.z,0.0)).rgb; +vec3 dither = (leftp+rightp)/2.0; -float YUV2G(vec3 _yuv) { - return dot(_yuv, vec3(1.0, -0.39465, -0.58060)); -} +res = rgb2yuv*res; dither =rgb2yuv*dither; +res =dither*0.49+res*0.51; //just keep a tiny evidence of dither -float YUV2B(vec3 _yuv) { - return dot(_yuv, vec3(1.0, 2.03211, 0.00000)); -} +vec3 check = COMPAT_TEXTURE(Source, pos + vec2(SourceSize.z,0.0)).rgb; +check = rgb2yuv*check; -vec3 YUV2RGB(vec3 _yuv) { - vec3 _rgb; - _rgb.r = YUV2R(_yuv); - _rgb.g = YUV2G(_yuv); - _rgb.b = YUV2B(_yuv); +float lum_diff= abs(check.r-res.r); +float chr_diff= abs(check.g-res.g); - return _rgb; -} +//flicker on luma/chroma difference +res +=lum_diff*abs(sin(iTime))*0.1; +res +=chr_diff*abs(sin(iTime))*0.1; - - - -void main() { - float a_kernel[5]; - a_kernel[0] = 2.0; - a_kernel[1] = 4.0; - a_kernel[2] = 1.0; - a_kernel[3] = 4.0; - a_kernel[4] = 2.0; - - vec2 pos = vTexCoord; - float y = pos.y*SourceSize.y; - float cent=floor(y)+0.5; - y = cent*SourceSize.w; - vec2 coords = vec2(pos.x,mix(pos.y,y,0.3)); - vec4 res; - float factor = InputSize.y/SourceSize.y; -//sawtooth effect - if( mod( floor(coords.y*OutputSize.y/factor), 2.0 ) == 0.0 ) { - res = texture2D( Source, coords + vec2(OutSize.z*0.5*factor, 0.0) ); - } else { - res = texture2D( Source, coords - vec2(OutSize.z*0.5*factor, 0.0) ); - } -//end of sawtooth - -// blur image - vec2 fragCoord = coords*OutputSize.xy; - float counter = 1.0; - for (int i = -2; i <= 2; i++) { - vec2 uv = vec2(fragCoord.x + float(i)*0.5*factor, fragCoord.y ) / OutputSize.xy; - res.rgb += texture2D(Source, uv).xyz; - counter += 1.0; - } - res.rgb /= counter; -//blur end - - - vec3 yuv = vec3(0.0); - -//color bleed - float px = 0.0; - for( int x = -1; x <= 1; x++ ) { - px = float(x) * SourceSize.z - SourceSize.w * 0.5; - yuv.g += RGB2U( texture2D( Source, coords + vec2(px*factor, 0.0)).rgb ) * a_kernel[x + 2]; - yuv.b += RGB2V( texture2D( Source, coords + vec2(px*factor, 0.0)).rgb ) * a_kernel[x + 2]; - } - - yuv.r = RGB2Y(res.rgb); - yuv.g /= 10.0; - yuv.b /= 10.0; - - res.rgb = (res.rgb * (1.0 - 0.5)) + (YUV2RGB(yuv) * 0.5); -//color bleed end - - FragColor = res; +res = yuv2rgb*res; +FragColor = vec4(res,1.0); } #endif