aboutsummaryrefslogtreecommitdiff
path: root/assets/shaders/ntsc.fs
blob: 871565bb857a1f452acdeaa9b127f2c6b2c03d87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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);
}