hero-mark-2/shaders/lcd.gdshader
2023-03-08 01:07:24 -05:00

43 lines
No EOL
1.2 KiB
Text

shader_type canvas_item;
const float PI = 3.1415926535;
uniform bool enabled = true;
uniform vec2 resolution;
uniform vec2 curvature;
uniform vec2 scanline_opacity;
uniform float brightness;
vec2 curve_uv(vec2 uv) {
uv = uv * 2.0 - 1.0;
vec2 offset = abs(uv.yx) / vec2(curvature.x, curvature.y);
uv = uv + uv * offset * offset;
uv = uv * 0.5 + 0.5;
return uv;
}
vec3 scanline_intensity(float uv, float res, float opacity) {
float intensity = sin((uv * res - 0.25) * PI * 2.0);
intensity = ((0.5 * intensity) + 0.5) * 0.9 + 0.1;
return vec3(pow(intensity, opacity));
}
void fragment() {
if (enabled) {
vec2 curved_uv = UV;
vec3 base_color = texture(TEXTURE, curved_uv).rgb;
base_color += vec3(1.0/256.0);
base_color *= scanline_intensity(curved_uv.x, resolution.x, scanline_opacity.y);
base_color *= scanline_intensity(curved_uv.y, resolution.y, scanline_opacity.x);
base_color *= vec3(brightness);
if (curved_uv.x < 0.0 || curved_uv.y < 0.0 || curved_uv.x > 1.0 || curved_uv.y > 1.0) {
COLOR = vec4(0.0, 0.0, 0.0, 0.0);
} else {
COLOR = vec4(base_color, 1.0);
}
} else {
COLOR = texture(TEXTURE, UV);
}
}