summaryrefslogtreecommitdiff
path: root/addons/crt_shader/CRTShader.gdshader
blob: d7ca24f4f366f7f24bd1c6a1a92a4a0e4cf83cfe (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
shader_type canvas_item;

uniform sampler2D screen_texture : hint_screen_texture;
uniform float screen_width = 1024;
uniform float screen_height = 600;

// Curvature
uniform float BarrelPower =1.1;
// Color bleeding
uniform float color_bleeding = 1.2;
uniform float bleeding_range_x = 3;
uniform float bleeding_range_y = 3;
// Scanline
uniform float lines_distance = 4.0;
uniform float scan_size = 2.0;
uniform float scanline_alpha = 0.9;
uniform float lines_velocity = 30.0;

vec2 distort(vec2 p)
{
	float angle = p.y / p.x;
	float theta = atan(p.y,p.x);
	float radius = pow(length(p), BarrelPower);

	p.x = radius * cos(theta);
	p.y = radius * sin(theta);

	return 0.5 * (p + vec2(1.0, 1.0));
}

void get_color_bleeding(inout vec4 current_color,inout vec4 color_left){
	current_color = current_color * vec4(color_bleeding, 0.5, 1.0 - color_bleeding, 1);
	color_left = color_left * vec4(1.0 - color_bleeding, 0.5, color_bleeding, 1);
}

void get_color_scanline(vec2 uv, inout vec4 c, float time){
	float line_row = floor((uv.y * screen_height/scan_size) + mod(time * lines_velocity, lines_distance));
	float n = 1.0 - ceil( (mod(line_row,lines_distance) / lines_distance));
	c = c - n * c * (1.0 - scanline_alpha);
	c.a = 1.0;
}

void fragment()
{
	vec2 xy = SCREEN_UV * 2.0;
	xy.x -= 1.0;
	xy.y -= 1.0;

	float d = length(xy);
	if(d < 1.5){
		xy = distort(xy);
	}
	else{
		xy = SCREEN_UV;
	}

	float pixel_size_x = 1.0/screen_width * bleeding_range_x;
	float pixel_size_y = 1.0/screen_height * bleeding_range_y;
	vec4 color_left = texture(screen_texture, xy - vec2(pixel_size_x, pixel_size_y));
	vec4 current_color = texture(screen_texture, xy);
	get_color_bleeding(current_color, color_left);
	vec4 c = current_color + color_left;
	get_color_scanline(xy,c,TIME);
	COLOR = c;
}