Files
tgcc-artest/Shaders/Palette_Cel.gdshader
Matteo Sonaglioni f7b334b21c first commit
2026-03-10 23:54:57 +01:00

66 lines
2.0 KiB
Plaintext

shader_type spatial;
render_mode specular_disabled;
// --- TEXTURE E COLORE BASE ---
uniform sampler2D albedo_texture : source_color, filter_nearest_mipmap;
uniform vec4 color_tint : source_color = vec4(1.0);
// --- CORREZIONE IMMAGINE ---
uniform float saturation : hint_range(0.0, 2.0) = 1.0;
uniform float brightness : hint_range(0.0, 2.0) = 1.0;
// --- LUCE E OMBRA ---
uniform float light_steps = 4.0; // Gradini di luce
uniform float shadow_intensity : hint_range(0.0, 1.0) = 0.5; // Quanto è scura l'ombra (0=nera)
// *** NUOVO PARAMETRO ***
// Colore con cui tingere le ombre. Default: Grigio-Bluastro (Cool shadows)
uniform vec4 shadow_tint : source_color = vec4(0.6, 0.6, 0.7, 1.0);
void vertex() {
// Vuoto per prop statici
}
void fragment() {
vec4 tex_color = texture(albedo_texture, UV);
vec3 base_rgb = tex_color.rgb * color_tint.rgb;
// --- SATURAZIONE ---
float luminance = dot(base_rgb, vec3(0.299, 0.587, 0.114));
vec3 saturated_color = mix(vec3(luminance), base_rgb, saturation);
// --- LUMINOSITA' ---
ALBEDO = saturated_color * brightness;
ROUGHNESS = 1.0;
SPECULAR = 0.0;
}
void light() {
// --- CEL SHADING ---
float NdotL = dot(NORMAL, LIGHT);
float light_amount = clamp(NdotL, 0.0, 1.0);
// Gradini
light_amount = ceil(light_amount * light_steps) / light_steps;
// Ombre proiettate (attenuazione)
float shadow = ATTENUATION;
shadow = ceil(shadow * light_steps) / light_steps;
// Calcolo quanta luce totale riceve il pixel (0.0 = ombra totale, 1.0 = luce piena)
float final_light_factor = light_amount * shadow;
// --- IL TRUCCO DEL HUE SHIFT ---
// Invece di moltiplicare solo per la luce, facciamo un mix tra:
// A) Colore in Ombra (Albedo * Tinta Ombra * Intensità minima)
// B) Colore Illuminato (Albedo * Colore Luce)
vec3 lit_color = ALBEDO * LIGHT_COLOR;
vec3 shadowed_color = ALBEDO * shadow_tint.rgb * shadow_intensity; // L'ombra si colora!
// Mischiamo i due stati in base alla luce ricevuta
vec3 final_color = mix(shadowed_color, lit_color, final_light_factor);
DIFFUSE_LIGHT += final_color / PI;
}