Palette Limiter Shader
Overview:
Screen reading shader which limits the colors in the viewport to a palette you provide. The shader works by picking the color within the palette that is the most similar to each pixel. Can just grab a palette off of something like Lospec and instantly get a cohesive visual style.
How to use:
- Place the shader material onto a SubViewPort Container
- Download or create a palette, then load it into the Palette Texture parameter
- Make sure to set the Num Colors parameter to however many colors are in your palette!
(Palette used in example is https://lospec.com/palette-list/slso8)
Shader code
shader_type canvas_item;
uniform int num_colors: hint_range(2,16) = 8;
uniform sampler2D PALETTE_TEXTURE: hint_default_black;
vec3 palette_limiter (in vec3 albedo){
float estimation_cutoff = 0.001;
vec3 closest_color;
float min_dist = 2.0;
float n = float(num_colors);
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;
closest_color = index_color;
if (min_dist < estimation_cutoff){
return closest_color;
}
}
}
return closest_color;
}
void fragment() {
COLOR.rgb = palette_limiter(texture(TEXTURE,UV).rgb);
}