Trainstation1
This commit is contained in:
65
Vetri.gdshader
Normal file
65
Vetri.gdshader
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user