-
-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
126 additions
and
101 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,77 +1,85 @@ | ||
/* | ||
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; | ||
|
||
uniform float boost : hint_range(1.0, 2.0, 0.01) = float(1.2); | ||
uniform float grille_opacity : hint_range(0.0, 1.0, 0.01) = float(0.85); | ||
uniform float scanlines_opacity : hint_range(0.0, 1.0, 0.01) = float(0.95); | ||
uniform float vignette_opacity : hint_range(0.1, 0.5, 0.01) = float(0.2); | ||
uniform float scanlines_speed : hint_range(0.0, 1.0, 0.01) = float(1.0); | ||
uniform bool show_grille = true; | ||
uniform bool show_scanlines = true; | ||
uniform bool show_vignette = true; | ||
uniform bool show_curvature = true; // Curvature works best on stretch mode 2d. | ||
const float PI = 3.14159265359; | ||
|
||
uniform vec2 screen_size = vec2(320.0, 180.0); | ||
uniform float aberration_amount : hint_range(0.0, 10.0, 1.0) = float(0.0); | ||
uniform bool move_aberration = false; | ||
uniform float aberration_speed : hint_range(0.01, 10.0, 0.01) = float(1.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) = 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) = 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 CRTCurveUV(vec2 uv) { | ||
if(show_curvature) { | ||
vec2 uv_curve(vec2 uv) { | ||
if (show_curvature) { | ||
uv = uv * 2.0 - 1.0; | ||
vec2 offset = abs(uv.yx) / vec2(6.0, 4.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 DrawVignette(inout vec3 color, vec2 uv) { | ||
if(show_vignette) { | ||
|
||
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; | ||
} else { | ||
return; | ||
} | ||
} | ||
|
||
void DrawScanline(inout vec3 color, vec2 uv, float time) { | ||
float scanline = clamp((scanlines_opacity - 0.05) + 0.05 * sin(3.1415926535 * (uv.y + 0.008 * time) * screen_size.y), 0.0, 1.0); | ||
float grille = (grille_opacity - 0.15) + 0.15 * clamp(1.5 * sin(3.1415926535 * uv.x * screen_size.x), 0.0, 1.0); | ||
|
||
if (show_scanlines) { | ||
color *= scanline; | ||
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_grille) { | ||
color *= grille; | ||
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; | ||
} | ||
|
||
color *= boost; | ||
} | ||
|
||
void fragment() { | ||
vec2 screen_crtUV = CRTCurveUV(SCREEN_UV); | ||
vec3 color = texture(SCREEN_TEXTURE, screen_crtUV).rgb; | ||
|
||
if (aberration_amount > 0.0) { | ||
float adjusted_amount = aberration_amount / screen_size.x; | ||
|
||
if (move_aberration == true) { | ||
adjusted_amount = (aberration_amount / screen_size.x) * cos((2.0 * 3.14159265359) * (TIME / aberration_speed)); | ||
} | ||
|
||
color.r = texture(SCREEN_TEXTURE, vec2(screen_crtUV.x + adjusted_amount, screen_crtUV.y)).r; | ||
color.g = texture(SCREEN_TEXTURE, screen_crtUV).g; | ||
color.b = texture(SCREEN_TEXTURE, vec2(screen_crtUV.x - adjusted_amount, screen_crtUV.y)).b; | ||
if (show_horizontal_scan_lines || show_vertical_scan_lines) { | ||
color *= boost; | ||
} | ||
vec2 crtUV = CRTCurveUV(UV); | ||
if (crtUV.x < 0.0 || crtUV.x > 1.0 || crtUV.y < 0.0 || crtUV.y > 1.0) { | ||
color = vec3(0.0, 0.0, 0.0); | ||
|
||
// 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; | ||
} | ||
|
||
DrawVignette(color, crtUV); | ||
DrawScanline(color, crtUV, TIME * scanlines_speed); | ||
|
||
|
||
COLOR = vec4(color, 1.0); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,4 +5,3 @@ | |
[resource] | ||
background_mode = 2 | ||
background_sky = SubResource( 1 ) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.