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; }