1#ifdef GL_ES
2precision mediump float;
3#endif
4
5uniform float u_Time;
6uniform sampler2D u_Tex0; // Escena del juego
7uniform sampler2D u_Tex1; // Textura rain.png
8varying vec2 v_TexCoord;
9uniform vec2 u_WalkOffset;
10uniform float u_Floor;
11
12void main(void)
13{
14 // 1. Restricción de piso (solo superficie y arriba)
15 if (u_Floor > 7.0) discard;
16
17 // 2. Coordenadas de la escena
18 vec4 Game = texture2D(u_Tex0, v_TexCoord);
19
20 // 3. Coordenadas para la lluvia (Screen Space + Movimiento)
21 // Usamos gl_FragCoord para que sea independiente de los tiles del mapa.
22 vec2 screenUV = gl_FragCoord.xy / 512.0;
23
24 // u_WalkOffset normalizado para fluidez al caminar
25 vec2 smoothWalk = u_WalkOffset / 32.0;
26
27 // Desplazamiento de la textura para caída a 135º (diagonal \)
28 float speed = u_Time * 1.5;
29 vec2 rainUV = screenUV * 1.2 + vec2(speed * 0.4, -speed) + (smoothWalk * 0.05);
30
31 // Leemos la textura de lluvia cargada en u_Tex1
32 vec4 RainTex = texture2D(u_Tex1, rainUV);
33
34 // 4. EFECTO REBOTE (Splashes)
35 // Generamos ondas circulares procedurales para simular el impacto en el suelo
36 float splash = 0.0;
37 vec2 splashGrid = fract(screenUV * 6.0 + vec2(u_Time * 0.1, 0.0));
38 float t = fract(u_Time * 3.0);
39
40 if (t > 0.85) {
41 float dist = length(splashGrid - 0.5);
42 float circle = abs(dist - (t - 0.85) * 2.5);
43 splash = smoothstep(0.04, 0.0, circle) * smoothstep(1.0, 0.85, t);
44 }
45
46 // Resultado Final
47 // El canal rojo de la textura rain.png suele ser el que tiene la información de la gota.
48 float intensity = RainTex.r * 0.8;
49 vec3 rainColor = RainTex.rgb + (splash * 0.5);
50
51 float opacity = 0.4;
52 gl_FragColor = vec4(Game.rgb + rainColor * intensity * opacity, Game.a);
53}
54