From 461fec003cdf3144b2e0d97392edd090f457a555 Mon Sep 17 00:00:00 2001 From: Sophia Pearson Date: Sun, 4 Sep 2022 11:42:20 +0200 Subject: gui: create basic layout --- Assets/Shaders/crt_shader.gdshader | 84 ++++++++++++++++++++++++++++++++++++++ Assets/Shaders/crt_shader.tres | 21 ++++++++++ 2 files changed, 105 insertions(+) create mode 100644 Assets/Shaders/crt_shader.gdshader create mode 100644 Assets/Shaders/crt_shader.tres (limited to 'Assets') diff --git a/Assets/Shaders/crt_shader.gdshader b/Assets/Shaders/crt_shader.gdshader new file mode 100644 index 0000000..445472e --- /dev/null +++ b/Assets/Shaders/crt_shader.gdshader @@ -0,0 +1,84 @@ +/* +Godot 3 2D CRT Shader. +A 2D shader for Godot 3 simulating a CRT.. +Author: hiulit +Repository: https://github.com/hiulit/Godot-3-2D-CRT-Shader +Issues: https://github.com/hiulit/Godot-3-2D-CRT-Shader/issues +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 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; +} + + +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; + } + + 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 new file mode 100644 index 0000000..1612d82 --- /dev/null +++ b/Assets/Shaders/crt_shader.tres @@ -0,0 +1,21 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=2] + +[ext_resource path="res://Assets/Shaders/crt_shader.gdshader" type="Shader" id=1] + +[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/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 -- cgit v1.2.3