shader_type spatial; // cull_disabled permette di vedere il vetro da entrambi i lati (utile se è un singolo piano) // depth_draw_opaque evita bug visivi di sovrapposizione tra oggetti trasparenti render_mode blend_mix, depth_draw_opaque, cull_disabled, shadows_disabled; uniform vec4 colore_vetro : source_color = vec4(0.4, 0.7, 0.9, 0.4); // --- EFFETTO BORDO (FRESNEL) --- uniform vec4 colore_bordo : source_color = vec4(1.0, 1.0, 1.0, 0.8); uniform float spessore_bordo : hint_range(0.0, 10.0) = 2.5; // --- RIFLESSO DEL SOLE (SPECULAR) --- uniform float dimensione_riflesso : hint_range(0.0, 1.0) = 0.05; uniform float intensita_riflesso : hint_range(0.0, 5.0) = 2.0; // --- STRISCE DIAGONALI (Opzionali, in stile Anime) --- uniform bool usa_strisce = true; uniform vec4 colore_strisce : source_color = vec4(1.0, 1.0, 1.0, 0.3); uniform float densita_strisce : hint_range(0.0, 20.0) = 6.0; uniform float spessore_strisce : hint_range(0.0, 1.0) = 0.2; void fragment() { // 1. Calcoliamo il Fresnel (l'angolo di visuale rispetto alla normale del vetro) float fresnel = 1.0 - clamp(dot(NORMAL, VIEW), 0.0, 1.0); // Applichiamo una curva "a gradino" (smoothstep) per renderlo in stile Toon (netto) float toon_fresnel = smoothstep(0.4, 0.45, pow(fresnel, spessore_bordo)); // 2. Calcoliamo le strisce diagonali float strisce = 0.0; if (usa_strisce) { // Crea linee diagonali basate sulle coordinate UV float pattern = fract((UV.x + UV.y) * densita_strisce); strisce = step(1.0 - spessore_strisce, pattern); } // 3. Mescoliamo i colori vec3 colore_finale = mix(colore_vetro.rgb, colore_strisce.rgb, strisce * colore_strisce.a); colore_finale = mix(colore_finale, colore_bordo.rgb, toon_fresnel); // 4. L'opacità aumenta sui bordi e sulle strisce float alpha_finale = colore_vetro.a; alpha_finale = max(alpha_finale, strisce * colore_strisce.a); alpha_finale = max(alpha_finale, toon_fresnel * colore_bordo.a); ALBEDO = colore_finale; ALPHA = clamp(alpha_finale, 0.0, 1.0); } void light() { // --- RIFLESSO TAGLIENTE DEL SOLE --- // Calcoliamo dove la luce colpisce il vetro rispetto alla telecamera vec3 half_vector = normalize(VIEW + LIGHT); float spec_dot = max(dot(NORMAL, half_vector), 0.0); // Taglio netto per renderlo stile Toon (invece di una sfumatura realistica) float spec_toon = smoothstep(1.0 - dimensione_riflesso - 0.01, 1.0 - dimensione_riflesso, spec_dot); // Luce Diffusa standard (piatta, ideale per il toon) float diff_dot = max(dot(NORMAL, LIGHT), 0.0); DIFFUSE_LIGHT += LIGHT_COLOR * ALBEDO * diff_dot * ATTENUATION; // Aggiungiamo il riflesso speculare, moltiplicato per il colore della luce (così al tramonto è arancione!) SPECULAR_LIGHT += LIGHT_COLOR * spec_toon * intensita_riflesso * ATTENUATION; }