uniform float u_Time; uniform sampler2D u_Tex0; uniform sampler2D u_Tex1; varying vec2 v_TexCoord; uniform vec2 u_Resolution; void main(void) { vec3 bgcol = texture2D(u_Tex0, v_TexCoord).xyz; // Resoluciones para escala estable float resX = u_Resolution.x > 0.0 ? u_Resolution.x : 800.0; float resY = u_Resolution.y > 0.0 ? u_Resolution.y : 600.0; vec2 screenUV = gl_FragCoord.xy / resX; // DOBLE CAPA VISIBLE: // Capa A vec2 uvA = (screenUV * 0.3) + (vec2(0.8, 0.3) * u_Time * 0.04); vec3 fogA = texture2D(u_Tex1, uvA).rgb; // Capa B (Dirección opuesta para dinamismo) vec2 uvB = (screenUV * 0.5) + (vec2(-0.5, 0.7) * u_Time * 0.06); vec3 fogB = texture2D(u_Tex1, uvB).rgb; // Promedio de color y fuerza de la nube vec3 combinedColor = (fogA + fogB) * 0.5; float combinedIntensity = (fogA.r + fogB.r) * 0.5; // Evitar luz (Antorchas) float brightness = dot(bgcol, vec3(0.299, 0.587, 0.114)); float lightAvoidance = 1.0 - smoothstep(0.3, 0.85, brightness); // Máscara HUD float mask = clamp(gl_FragCoord.y / (resY * 0.4), 0.0, 1.0); // RESULTADO VISIBLE: Aumentamos el multiplicador a 1.5 float finalAlpha = mask * 1.5 * lightAvoidance * combinedIntensity; // Mezcla con brillo extra para que las nubes destaquen vec3 result = mix(bgcol, combinedColor * 1.4, finalAlpha); gl_FragColor = vec4(result, 1.0); }