66 lines
2.0 KiB
Plaintext
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;
|
|
} |