initial commit
This commit is contained in:
89
Assets/Scripts/Shaders/psx.gdshader
Normal file
89
Assets/Scripts/Shaders/psx.gdshader
Normal file
@@ -0,0 +1,89 @@
|
||||
shader_type canvas_item;
|
||||
|
||||
uniform sampler2D screen_texture : hint_screen_texture;
|
||||
uniform float pixel_resolution : hint_range(64.0, 512.0) = 240.0;
|
||||
uniform int color_steps : hint_range(2, 64) = 16;
|
||||
uniform float noise_strength : hint_range(0.0, 1.0) = 0.1;
|
||||
uniform bool enable_dither = true;
|
||||
uniform float dither_strength : hint_range(0.0, 1.0) = 0.3;
|
||||
|
||||
uniform bool enable_glow = true;
|
||||
uniform float glow_strength : hint_range(0.0, 1.0) = 0.4;
|
||||
uniform float glow_spread : hint_range(0.001, 0.01) = 0.005;
|
||||
|
||||
uniform bool enable_vintage = true; // Toggle
|
||||
uniform float vintage_strength : hint_range(0.0, 1.0) = 0.8;
|
||||
|
||||
float random(vec2 co) {
|
||||
return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
|
||||
}
|
||||
|
||||
float bayer_dither(vec2 pos) {
|
||||
int x = int(mod(pos.x, 4.0));
|
||||
int y = int(mod(pos.y, 4.0));
|
||||
int index = x + y * 4;
|
||||
|
||||
float bayer[16] = float[](
|
||||
0.0, 8.0, 2.0, 10.0,
|
||||
12.0, 4.0, 14.0, 6.0,
|
||||
3.0, 11.0, 1.0, 9.0,
|
||||
15.0, 7.0, 13.0, 5.0
|
||||
);
|
||||
|
||||
return bayer[index] / 16.0;
|
||||
}
|
||||
|
||||
vec3 get_glow(vec2 uv) {
|
||||
vec3 col = vec3(0.0);
|
||||
float total = 0.0;
|
||||
|
||||
for (int x = -1; x <= 1; x++) {
|
||||
for (int y = -1; y <= 1; y++) {
|
||||
vec2 offset = vec2(float(x), float(y)) * glow_spread;
|
||||
col += texture(screen_texture, uv + offset).rgb;
|
||||
total += 1.0;
|
||||
}
|
||||
}
|
||||
return col / total;
|
||||
}
|
||||
|
||||
vec3 apply_black_vintage_edges(vec3 color, vec2 uv) {
|
||||
// Distance from screen center
|
||||
float dist = distance(uv, vec2(0.5));
|
||||
|
||||
// Mask: only affects edges
|
||||
float edge_mask = smoothstep(0.4, 0.8, dist);
|
||||
|
||||
// Blend edges to black
|
||||
color = mix(color, vec3(0.0), edge_mask * vintage_strength);
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
vec2 pixel_uv = floor(UV * pixel_resolution) / pixel_resolution;
|
||||
vec3 color = texture(screen_texture, pixel_uv).rgb;
|
||||
|
||||
if (enable_glow) {
|
||||
vec3 blurred = get_glow(UV);
|
||||
color += blurred * glow_strength;
|
||||
}
|
||||
|
||||
float steps = float(color_steps);
|
||||
color = floor(color * steps + 0.5) / steps;
|
||||
|
||||
float noise = (random(UV + TIME) - 0.5) * noise_strength;
|
||||
color += noise;
|
||||
|
||||
if (enable_dither) {
|
||||
float threshold = bayer_dither(FRAGCOORD.xy);
|
||||
color += (dither_strength * (threshold - 0.5));
|
||||
}
|
||||
|
||||
// Black vintage only on edges
|
||||
if (enable_vintage) {
|
||||
color = apply_black_vintage_edges(color, UV);
|
||||
}
|
||||
|
||||
COLOR.rgb = clamp(color, 0.0, 1.0);
|
||||
}
|
||||
Reference in New Issue
Block a user