diff options
Diffstat (limited to 'addons/crt_shader/CRTShader.gdshader')
-rw-r--r-- | addons/crt_shader/CRTShader.gdshader | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/addons/crt_shader/CRTShader.gdshader b/addons/crt_shader/CRTShader.gdshader new file mode 100644 index 0000000..d7ca24f --- /dev/null +++ b/addons/crt_shader/CRTShader.gdshader @@ -0,0 +1,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; +} |