From 000f1c89ce7505b7d0d59af86c5ab5be2cfca54e Mon Sep 17 00:00:00 2001 From: Sophia Pearson Date: Tue, 6 Sep 2022 00:31:07 +0200 Subject: game: reorganize global structure --- Assets/Shaders/crt_shader.gdshader | 127 ++++++++++++++++++------------------- Assets/Shaders/crt_shader.tres | 21 ++---- 2 files changed, 70 insertions(+), 78 deletions(-) (limited to 'Assets/Shaders') diff --git a/Assets/Shaders/crt_shader.gdshader b/Assets/Shaders/crt_shader.gdshader index 445472e..5c698a6 100644 --- a/Assets/Shaders/crt_shader.gdshader +++ b/Assets/Shaders/crt_shader.gdshader @@ -9,76 +9,75 @@ License: MIT https://github.com/hiulit/Godot-3-2D-CRT-Shader/blob/master/LICENSE shader_type canvas_item; -const float PI = 3.14159265359; -uniform vec2 screen_size = vec2(320.0, 180.0); -uniform bool show_curvature = true; -uniform float curvature_x_amount : hint_range(3.0, 15.0, 0.01) = float(6.0); -uniform float curvature_y_amount : hint_range(3.0, 15.0, 0.01) = float(4.0); -uniform vec4 corner_color : hint_color = vec4(0.0, 0.0, 0.0, 1.0); -uniform bool show_vignette = true; +uniform bool chromatic_abberation_enabled = true; +uniform float chromatic_abberation_amount : hint_range(0.0, 10.0, 0.01) = 4.0; + +uniform bool vignette_enabled = true; uniform float vignette_opacity : hint_range(0.0, 1.0, 0.01) = 0.2; -uniform bool show_horizontal_scan_lines = true; -uniform float horizontal_scan_lines_amount : hint_range(0.0, 180.0, 0.1) = 180.0; -uniform float horizontal_scan_lines_opacity : hint_range(0.0, 1.0, 0.01) = 1.0; -uniform bool show_vertical_scan_lines = false; -uniform float vertical_scan_lines_amount : hint_range(0.0, 320.0, 0.1) = 320.0; -uniform float vertical_scan_lines_opacity : hint_range(0.0, 1.0, 0.01) = 1.0; -uniform float boost : hint_range(1.0, 2.0, 0.01) = 1.2; -uniform float aberration_amount : hint_range(0.0, 10.0, 0.01) = 0.0; - -vec2 uv_curve(vec2 uv) { - if (show_curvature) { - uv = uv * 2.0 - 1.0; - vec2 offset = abs(uv.yx) / vec2(curvature_x_amount, curvature_y_amount); - uv = uv + uv * offset * offset; - uv = uv * 0.5 + 0.5; - } - - return uv; + +uniform bool scan_lines_enabled = true; +uniform float scan_lines_count : hint_range(0, 180, 1) = 180; +uniform float scan_lines_opacity : hint_range(0.0, 1.0, 0.01) = 1.0; + +uniform float boost_intensity : hint_range(1.0, 2.0, 0.01) = 1.2; + +const float PI = 3.14159265359; + +/** + * Apply chromatic abberation the the given texture. + */ +vec3 chromatic_abberation(sampler2D tex, vec2 uv, vec2 screen_size) { + float adjusted_amount = chromatic_abberation_amount / screen_size.x; + + vec3 color; + + color.r = texture(tex, vec2(clamp(uv.x + adjusted_amount, 0.0, 1.0), uv.y)).r; + color.g = texture(tex, uv).g; + color.b = texture(tex, vec2(clamp(uv.x - adjusted_amount, 0.0, 1.0), uv.y)).b; + + return color; +} + +/** + * Apply a vignette. + */ +vec3 vignette(vec3 color, vec2 uv, vec2 screen_size) { + float vignette = uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y); + vignette = clamp(pow((screen_size.x / 4.0) * vignette, vignette_opacity), 0.0, 1.0); + return color * vignette; } +/** + * Apply scan lines + */ +vec3 scan_lines(vec3 color, vec2 uv) { + float strength = clamp(sin(uv.y * scan_lines_count * PI * 2.0), 0.65, 0.85); + vec3 scan_line = vec3(pow(strength, scan_lines_opacity)); + return color * scan_line * boost_intensity; +} void fragment() { - vec2 uv = uv_curve(UV); - vec2 screen_uv = uv_curve(SCREEN_UV); - vec3 color = texture(SCREEN_TEXTURE, screen_uv).rgb; - - if (aberration_amount > 0.0) { - float adjusted_amount = aberration_amount / screen_size.x; - color.r = texture(SCREEN_TEXTURE, vec2(screen_uv.x + adjusted_amount, screen_uv.y)).r; - color.g = texture(SCREEN_TEXTURE, screen_uv).g; - color.b = texture(SCREEN_TEXTURE, vec2(screen_uv.x - adjusted_amount, screen_uv.y)).b; - } - - if (show_vignette) { - float vignette = uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y); - vignette = clamp(pow((screen_size.x / 4.0) * vignette, vignette_opacity), 0.0, 1.0); - color *= vignette; - } - - if (show_horizontal_scan_lines) { - float s = sin(screen_uv.y * horizontal_scan_lines_amount * PI * 2.0); - s = (s * 0.5 + 0.5) * 0.9 + 0.1; - vec4 scan_line = vec4(vec3(pow(s, horizontal_scan_lines_opacity)), 1.0); - color *= scan_line.rgb; - } - - if (show_vertical_scan_lines) { - float s = sin(screen_uv.x * vertical_scan_lines_amount * PI * 2.0); - s = (s * 0.5 + 0.5) * 0.9 + 0.1; - vec4 scan_line = vec4(vec3(pow(s, vertical_scan_lines_opacity)), 1.0); - color *= scan_line.rgb; - } - - if (show_horizontal_scan_lines || show_vertical_scan_lines) { - color *= boost; - } - - // Fill the blank space of the corners, left by the curvature, with black. - if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { - color = corner_color.rgb; - } + vec3 color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb; + vec2 screen_size = 1.0 / SCREEN_PIXEL_SIZE; + + color = mix( + color, + chromatic_abberation(SCREEN_TEXTURE, SCREEN_UV, screen_size), + float(chromatic_abberation_enabled) + ); + + color = mix( + color, + vignette(color, SCREEN_UV, screen_size), + float(vignette_enabled) + ); + + color = mix( + color, + scan_lines(color, SCREEN_UV), + float(scan_lines_enabled) + ); COLOR = vec4(color, 1.0); } \ No newline at end of file diff --git a/Assets/Shaders/crt_shader.tres b/Assets/Shaders/crt_shader.tres index 1612d82..cf5c247 100644 --- a/Assets/Shaders/crt_shader.tres +++ b/Assets/Shaders/crt_shader.tres @@ -4,18 +4,11 @@ [resource] shader = ExtResource( 1 ) -shader_param/screen_size = Vector2( 640, 480 ) -shader_param/show_curvature = false -shader_param/curvature_x_amount = 6.0 -shader_param/curvature_y_amount = 4.0 -shader_param/corner_color = Color( 0, 0, 0, 1 ) -shader_param/show_vignette = true +shader_param/chromatic_abberation_enabled = true +shader_param/chromatic_abberation_amount = 4.0 +shader_param/vignette_enabled = true shader_param/vignette_opacity = 0.1 -shader_param/show_horizontal_scan_lines = true -shader_param/horizontal_scan_lines_amount = 90.0 -shader_param/horizontal_scan_lines_opacity = 0.1 -shader_param/show_vertical_scan_lines = false -shader_param/vertical_scan_lines_amount = 320.0 -shader_param/vertical_scan_lines_opacity = 1.0 -shader_param/boost = 1.25 -shader_param/aberration_amount = 1.5 +shader_param/scan_lines_enabled = true +shader_param/scan_lines_count = 180.0 +shader_param/scan_lines_opacity = 1.0 +shader_param/boost_intensity = 1.3 -- cgit v1.2.3