Trainstation1

This commit is contained in:
Matteo Sonaglioni
2026-04-03 23:32:15 +02:00
parent 8faf4e91b5
commit 555228a64f
24 changed files with 1161 additions and 145 deletions

65
Vetri.gdshader Normal file
View File

@@ -0,0 +1,65 @@
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;
}