Figments-of-the-Night/scripts/shaders/pixelation.gdshader
Gerard Gascón b99855351d init
2025-04-24 17:23:34 +02:00

45 lines
No EOL
1.3 KiB
Text

shader_type canvas_item;
uniform int num_colors: hint_range(2,32) = 8;
uniform sampler2D PALETTE_TEXTURE: hint_default_black;
uniform sampler2D PALETTE_TEXTURE_LOW: hint_default_black;
uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
uniform int u_dither_size = 4;
vec3 palette_limiter (in vec3 albedo, in vec2 uv){
float estimation_cutoff = 0.001;
vec3 closest_color;
float min_dist = 2.0;
float n = float(num_colors);
bool palette_low = (int(uv.y)) % 2 == 0;
for (int i=0; i<num_colors; i++ ){
float index = 1.000/(2.000*n)+float(i)/n;
vec3 index_color = texture(PALETTE_TEXTURE, vec2(index,0.5)).rgb;
float dist = length(index_color - albedo);
if (dist < min_dist) {
min_dist = dist;
if(palette_low){
closest_color = texture(PALETTE_TEXTURE_LOW, vec2(index,0.5)).rgb;
}else{
closest_color = index_color;
}
if (min_dist < estimation_cutoff){
return closest_color;
}
}
}
return closest_color;
}
void fragment() {
vec2 screen_size = vec2(textureSize(SCREEN_TEXTURE, 0)) / float(u_dither_size);
vec2 uv_cord = floor(UV * screen_size);
vec2 screen_sample_uv = uv_cord / screen_size;
vec3 current_color = texture(SCREEN_TEXTURE, screen_sample_uv).rgb;
COLOR.rgb = palette_limiter(current_color, uv_cord);
}