From 3f86cb00681200d89b5c09d5c6b6bde53b6c75bd Mon Sep 17 00:00:00 2001 From: Sophia Pearson Date: Sat, 24 Dec 2022 11:21:04 +0100 Subject: effects: start rework of screen effect --- Assets/Shaders/Bloom.gdshader | 8 ++++ Assets/Shaders/Scanlines.gdshader | 16 ++++++++ Assets/Shaders/crt_shader.gdshader | 78 -------------------------------------- Assets/Shaders/crt_shader.tres | 17 --------- Scenes/MonitorEffect.tscn | 31 +++++++-------- 5 files changed, 37 insertions(+), 113 deletions(-) create mode 100644 Assets/Shaders/Bloom.gdshader create mode 100644 Assets/Shaders/Scanlines.gdshader delete mode 100644 Assets/Shaders/crt_shader.gdshader delete mode 100644 Assets/Shaders/crt_shader.tres diff --git a/Assets/Shaders/Bloom.gdshader b/Assets/Shaders/Bloom.gdshader new file mode 100644 index 0000000..cf28bfb --- /dev/null +++ b/Assets/Shaders/Bloom.gdshader @@ -0,0 +1,8 @@ +shader_type canvas_item; + +void fragment() { + vec4 color = texture(SCREEN_TEXTURE, SCREEN_UV); + vec2 uv = SCREEN_UV - 0.5; + + COLOR = color; +} \ No newline at end of file diff --git a/Assets/Shaders/Scanlines.gdshader b/Assets/Shaders/Scanlines.gdshader new file mode 100644 index 0000000..4ed746c --- /dev/null +++ b/Assets/Shaders/Scanlines.gdshader @@ -0,0 +1,16 @@ +shader_type canvas_item; + +uniform float count: hint_range(240, 480, 2) = 320; +uniform float opacity: hint_range(0.0, 1.0, 0.01) = 0.3; + +void fragment() { + vec3 color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb; + vec2 uv = SCREEN_UV; + + vec2 line = vec2(sin(uv.y * count), cos(uv.y * count)); + vec3 scanlines = vec3(line.y, line.x, line.y); + + color += color * scanlines * opacity; + + COLOR = vec4(color, 1.0); +} \ No newline at end of file diff --git a/Assets/Shaders/crt_shader.gdshader b/Assets/Shaders/crt_shader.gdshader deleted file mode 100644 index e91bcfd..0000000 --- a/Assets/Shaders/crt_shader.gdshader +++ /dev/null @@ -1,78 +0,0 @@ -shader_type canvas_item; - -uniform bool bloom_enabled = true; -uniform float bloom_amount: hint_range(0.0, 0.5, 0.01) = 0.5; -uniform float bloom_radius: hint_range(0.0, 10.0, 0.1) = 2.0; - -uniform bool chromatic_abberation_enabled = true; -uniform float chromatic_abberation_amount : hint_range(0.0, 10.0, 0.01) = 4.0; - -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 bool vignette_enabled = true; -uniform float vignette_opacity : hint_range(0.0, 1.0, 0.01) = 0.2; - -uniform float boost_intensity : hint_range(1.0, 2.0, 0.01) = 1.2; - -/** - * Apply bloom. - */ -vec3 bloom(sampler2D tex, vec2 uv, vec2 pixel_size) -{ - vec3 glow0 = max(textureLod(tex, uv + vec2(-pixel_size.x, 0), bloom_radius).rgb - bloom_amount, vec3(0.0)); - vec3 glow1 = max(textureLod(tex, uv + vec2(pixel_size.x, 0), bloom_radius).rgb - bloom_amount, vec3(0.0)); - vec3 glow2 = max(textureLod(tex, uv + vec2(0, -pixel_size.y), bloom_radius).rgb - bloom_amount, vec3(0.0)); - vec3 glow3 = max(textureLod(tex, uv + vec2(0, pixel_size.y), bloom_radius).rgb - bloom_amount, vec3(0.0)); - - return 0.25 * (glow0 + glow1 + glow2 + glow3); -} - -/** - * 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 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; -} - -/** - * 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; -} - -void fragment() { - vec3 color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb; - vec2 screen_size = 1.0 / SCREEN_PIXEL_SIZE; - - vec3 bloom_color = bloom(SCREEN_TEXTURE, SCREEN_UV, SCREEN_PIXEL_SIZE); - vec3 scan_lines_color = scan_lines(color, SCREEN_UV); - - color = mix(color, chromatic_abberation(SCREEN_TEXTURE, SCREEN_UV, screen_size), float(chromatic_abberation_enabled)); - color = mix(color, bloom_color, 0.5 * float(bloom_enabled)); - color = color + scan_lines(color, SCREEN_UV) * float(scan_lines_enabled); - color = color * vignette(color, SCREEN_UV, screen_size); - - COLOR = vec4(color, 1.0); -} diff --git a/Assets/Shaders/crt_shader.tres b/Assets/Shaders/crt_shader.tres deleted file mode 100644 index 4a7bb37..0000000 --- a/Assets/Shaders/crt_shader.tres +++ /dev/null @@ -1,17 +0,0 @@ -[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/bloom_enabled = true -shader_param/bloom_amount = 0.5 -shader_param/bloom_radius = 2.0 -shader_param/chromatic_abberation_enabled = true -shader_param/chromatic_abberation_amount = 4.0 -shader_param/scan_lines_enabled = true -shader_param/scan_lines_count = 180.0 -shader_param/scan_lines_opacity = 1.0 -shader_param/vignette_enabled = true -shader_param/vignette_opacity = 0.1 -shader_param/boost_intensity = 1.3 diff --git a/Scenes/MonitorEffect.tscn b/Scenes/MonitorEffect.tscn index 3cd345e..8cd5968 100644 --- a/Scenes/MonitorEffect.tscn +++ b/Scenes/MonitorEffect.tscn @@ -1,28 +1,23 @@ [gd_scene load_steps=3 format=3 uid="uid://bgddsbe8r06bh"] -[ext_resource type="Shader" path="res://Assets/Shaders/crt_shader.gdshader" id="1"] +[ext_resource type="Shader" path="res://Assets/Shaders/Scanlines.gdshader" id="1_jndns"] -[sub_resource type="ShaderMaterial" id="1"] -shader = ExtResource("1") -shader_parameter/bloom_amount = 0.3 -shader_parameter/bloom_enabled = true -shader_parameter/bloom_radius = 2.0 -shader_parameter/boost_intensity = 1.3 -shader_parameter/chromatic_abberation_amount = 2.0 -shader_parameter/chromatic_abberation_enabled = true -shader_parameter/scan_lines_count = 180.0 -shader_parameter/scan_lines_enabled = true -shader_parameter/scan_lines_opacity = 0.85 -shader_parameter/vignette_enabled = true -shader_parameter/vignette_opacity = 0.33 +[sub_resource type="ShaderMaterial" id="ShaderMaterial_sx85s"] +shader = ExtResource("1_jndns") +shader_parameter/count = 480.0 +shader_parameter/opacity = 0.05 [node name="MonitorEffect" type="CanvasLayer"] layer = 2 -[node name="ShaderRectangle" type="ColorRect" parent="."] -material = SubResource("1") -clip_contents = true +[node name="Bloom" type="CanvasLayer" parent="."] + +[node name="Scanlines" type="CanvasLayer" parent="."] + +[node name="Effect" type="ColorRect" parent="Scanlines"] +material = SubResource("ShaderMaterial_sx85s") anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 -mouse_filter = 2 +grow_horizontal = 2 +grow_vertical = 2 -- cgit v1.2.3