diff options
Diffstat (limited to 'assets/shaders/ntsc.fs')
| -rw-r--r-- | assets/shaders/ntsc.fs | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/assets/shaders/ntsc.fs b/assets/shaders/ntsc.fs new file mode 100644 index 0000000..871565b --- /dev/null +++ b/assets/shaders/ntsc.fs @@ -0,0 +1,99 @@ +#version 330 + +in vec2 fragTexCoord; +uniform sampler2D texture0; + +vec3 rgb2yiq(vec3 c){ + return vec3( + (0.2989 * c.x + 0.5959 * c.y + 0.2115 * c.z), + (0.5870 * c.x - 0.2744 * c.y - 0.5229 * c.z), + (0.1140 * c.x - 0.3216 * c.y + 0.3114 * c.z) + ); +} +vec3 yiq2rgb(vec3 c){ + return vec3( + (1.0 * c.x + 1.0 * c.y + 1.0 * c.z), + (0.956 * c.x - 0.2720 * c.y - 1.1060 * c.z), + (0.6210 * c.x - 0.6474 * c.y + 1.7046 * c.z) + ); +} + +vec2 Circle(float Start, float Points, float Point){ + float Rad = (3.141592 * 2.0 * (1.0 / Points)) * (Point + Start); + return vec2(-(.3+Rad), cos(Rad)); +} + +vec3 Blur(vec2 uv, float f, float d, sampler2D iChannel0){ + vec2 PixelOffset = vec2(d, 0); + + float Start = 2.0 / 14.0; + vec2 Scale = 0.66 * 3.0 * 2.0 * PixelOffset.xy; + + vec3 N0 = texture(iChannel0, uv + Circle(Start, 14.0, 0.0) * Scale).rgb; + vec3 N1 = texture(iChannel0, uv + Circle(Start, 14.0, 1.0) * Scale).rgb; + vec3 N2 = texture(iChannel0, uv + Circle(Start, 14.0, 2.0) * Scale).rgb; + vec3 N3 = texture(iChannel0, uv + Circle(Start, 14.0, 3.0) * Scale).rgb; + vec3 N4 = texture(iChannel0, uv + Circle(Start, 14.0, 4.0) * Scale).rgb; + vec3 N5 = texture(iChannel0, uv + Circle(Start, 14.0, 5.0) * Scale).rgb; + vec3 N6 = texture(iChannel0, uv + Circle(Start, 14.0, 6.0) * Scale).rgb; + vec3 N7 = texture(iChannel0, uv + Circle(Start, 14.0, 7.0) * Scale).rgb; + vec3 N8 = texture(iChannel0, uv + Circle(Start, 14.0, 8.0) * Scale).rgb; + vec3 N9 = texture(iChannel0, uv + Circle(Start, 14.0, 9.0) * Scale).rgb; + vec3 N10 = texture(iChannel0, uv + Circle(Start, 14.0, 10.0) * Scale).rgb; + vec3 N11 = texture(iChannel0, uv + Circle(Start, 14.0, 11.0) * Scale).rgb; + vec3 N12 = texture(iChannel0, uv + Circle(Start, 14.0, 12.0) * Scale).rgb; + vec3 N13 = texture(iChannel0, uv + Circle(Start, 14.0, 13.0) * Scale).rgb; + vec3 N14 = texture(iChannel0, uv).rgb; + + vec3 clr = N14; + float W = 1.0 / 15.0; + + clr = + (N0 * W) + + (N1 * W) + + (N2 * W) + + (N3 * W) + + (N4 * W) + + (N5 * W) + + (N6 * W) + + (N7 * W) + + (N8 * W) + + (N9 * W) + + (N10 * W) + + (N11 * W) + + (N12 * W) + + (N13 * W) + + (N14 * W); + + return clr; +} + +out vec4 finalColor; + +void main(){ + vec2 uv = gl_FragCoord.xy / vec2(textureSize(texture0, 0)); + vec3 color; + + // Apply blur + float d = 0.051; + float c = 0.002 * d; + + color.xyz = Blur(uv, 0.0, c + c * (uv.x), texture0); + float y = rgb2yiq(color.xyz).r; + + uv.x += 0.01 * d; + c *= 6.0; + color.xyz = Blur(uv, 0.333, c, texture0); + float i = rgb2yiq(color.xyz).g; + + uv.x += 0.005 * d; + + c *= 2.50; + color.xyz = Blur(uv, 0.666, c + c * (-uv.x), texture0); + float q = rgb2yiq(color.xyz).b; + + color.xyz = yiq2rgb(vec3(y, i, q)); + color.xyz *= smoothstep(1.0, 0.999, uv.x - .1); + + finalColor = vec4(color, 1.0); +}
\ No newline at end of file |
