← 毎日のシェーダー~/adventure-log/shaders/2026-10-01

雲の切れ間を待つ

雲の切れ間を待つ灰色の雲がゆっくり流れ、薄いところから温かな光がにじみ、綿毛が昇ってゆく。 · くもり 19–28°C
ソースstratified domain-warped fbm cloud layers backlit by a breathing radial glow, with rising soft motes
2026-10-01.frag
precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;

float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }

float noise(vec2 p){
  vec2 i = floor(p);
  vec2 f = fract(p);
  f = f * f * (3.0 - 2.0 * f);
  float a = hash(i);
  float b = hash(i + vec2(1.0, 0.0));
  float c = hash(i + vec2(0.0, 1.0));
  float d = hash(i + vec2(1.0, 1.0));
  return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
}

float fbm(vec2 p){
  float v = 0.0;
  float a = 0.5;
  for (int i = 0; i < 4; i++) {
    v += a * noise(p);
    p = p * 2.03 + vec2(1.7, 9.2);
    a *= 0.5;
  }
  return v;
}

void main(){
  vec2 uv = gl_FragCoord.xy / u_resolution;
  float asp = u_resolution.x / u_resolution.y;
  vec2 p = vec2((uv.x - 0.5) * asp, uv.y - 0.5);
  float t = u_time;

  vec2 sp = vec2(0.28, -0.14);
  float d = length((p - sp) * vec2(0.6, 1.0));
  float breathe = 0.5 + 0.5 * sin(t * 0.25);
  float glow = exp(-d * 2.4) * (0.75 + 0.25 * breathe);

  vec3 skyTop = vec3(0.44, 0.46, 0.55);
  vec3 skyLow = vec3(0.62, 0.58, 0.60);
  vec3 col = mix(skyLow, skyTop, uv.y);
  col += vec3(1.0, 0.62, 0.34) * glow * 0.5;

  for (int i = 0; i < 3; i++) {
    float fi = float(i);
    vec2 q = vec2(p.x * 1.3 + t * 0.012 * (1.0 + fi), p.y * 4.2 + fi * 3.1);
    float w = fbm(q * 0.5 + vec2(t * 0.02, fi));
    float n = fbm(q + vec2(w * 1.2, w * 0.4));
    float yc = 0.3 - fi * 0.24;
    float band = exp(-pow((p.y - yc) * 4.5, 2.0));
    float dens = smoothstep(0.32, 0.72, n + band * 0.28 - 0.08);
    vec3 cBase = mix(vec3(0.36, 0.37, 0.45), vec3(0.55, 0.54, 0.60), fi * 0.35);
    vec3 cloud = cBase + vec3(1.0, 0.68, 0.42) * glow * 0.55 * (1.0 - dens * 0.7);
    cloud += vec3(0.05, 0.04, 0.03) * (1.0 - n);
    col = mix(col, cloud, dens * (0.8 - fi * 0.1));
  }

  float seam = exp(-pow((p.y - sp.y - 0.02) * 7.0, 2.0)) * exp(-abs(p.x - sp.x) * 2.0);
  col += vec3(0.9, 0.55, 0.3) * seam * 0.18 * (0.8 + 0.2 * breathe);

  for (int i = 0; i < 9; i++) {
    float fi = float(i);
    float h1 = hash(vec2(fi, 1.0));
    float h2 = hash(vec2(fi, 2.0));
    float h3 = hash(vec2(fi, 3.0));
    float y = mod(h2 + t * 0.018 * (0.6 + h3), 1.3) - 0.65;
    float x = (h1 - 0.5) * asp + sin(t * 0.3 + fi * 1.7) * 0.03 + (y + 0.65) * 0.08;
    vec2 c = vec2(x, y);
    float r = 0.016 + 0.01 * h3;
    float dd = length(p - c);
    float fade = smoothstep(-0.65, -0.4, y) * smoothstep(0.65, 0.35, y);
    col += vec3(1.0, 0.86, 0.66) * smoothstep(r * 2.2, r * 0.3, dd) * 0.28 * fade;
  }

  float vig = smoothstep(1.1, 0.3, length(p * vec2(0.8, 1.1)));
  col *= 0.82 + 0.18 * vig;
  col = 1.0 - exp(-col * 1.6);
  gl_FragColor = vec4(col, 1.0);
}