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

はずむ秋晴れ

はずむ秋晴れ薄い雲がゆっくり流れ、切り紙の玉が秋の野原で軽やかに弾む。 · 晴れ時々くもり 18–25°C
ソースflat paper-cutout collage: smooth-min metaball clouds with offset drop shadows, squash-and-stretch bouncing disc SDFs, concentric sun-ring glow
2026-10-07.frag
precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;

float smin(float a, float b, float k) {
  float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0);
  return mix(b, a, h) - k * h * (1.0 - h);
}

float cloud(vec2 p, float s) {
  p /= s;
  float d = length(p) - 0.08;
  d = smin(d, length(p - vec2(0.085, -0.02)) - 0.06, 0.04);
  d = smin(d, length(p - vec2(-0.09, -0.025)) - 0.055, 0.04);
  d = smin(d, length(p - vec2(0.02, 0.045)) - 0.065, 0.04);
  d = max(d, -p.y - 0.06);
  return d * s;
}

vec3 layer(vec3 col, vec3 c, float d, float px) {
  return mix(col, c, 1.0 - smoothstep(-px, px, d));
}

float shade(float d, float w) {
  return 1.0 - smoothstep(0.0, w, d);
}

void main() {
  vec2 uv = (gl_FragCoord.xy - 0.5 * u_resolution) / u_resolution.y;
  float px = 1.5 / u_resolution.y;
  float t = u_time;
  vec3 col = mix(vec3(0.82, 0.89, 0.90), vec3(0.33, 0.60, 0.86), smoothstep(-0.3, 0.5, uv.y));

  vec2 sp = vec2(-0.42, 0.24);
  float sr = length(uv - sp);
  float ang = atan(uv.y - sp.y, uv.x - sp.x);
  float rays = smoothstep(0.2, 0.6, sin(ang * 9.0 + t * 0.15)) * exp(-sr * 2.2) * 0.18;
  float rings = (0.5 + 0.5 * sin(sr * 38.0 - t * 0.9)) * exp(-sr * 4.5) * 0.35;
  col = mix(col, vec3(1.0, 0.86, 0.52), clamp(rays + rings, 0.0, 1.0));
  col = layer(col, vec3(1.0, 0.79, 0.33), sr - 0.1, px);
  col = layer(col, vec3(1.0, 0.86, 0.48), max(sr - 0.1, -(length(uv - sp - vec2(0.03, -0.03)) - 0.1)), px);

  for (int i = 0; i < 3; i++) {
    float fi = float(i);
    float s = 0.8 + 0.3 * fract(fi * 0.61);
    vec2 c = vec2(mod(fi * 0.63 + t * (0.018 + 0.006 * fi), 1.9) - 0.95, 0.31 - fi * 0.11 + 0.01 * sin(t * 0.5 + fi * 2.0));
    vec2 q = uv - c;
    float d = cloud(q, s);
    float ds = cloud(q - vec2(0.012, -0.015), s);
    col = mix(col, col * vec3(0.80, 0.85, 0.92), 0.6 * shade(ds, 0.025));
    col = layer(col, vec3(0.98, 0.97, 0.93), d, px);
    col = layer(col, vec3(0.86, 0.90, 0.95), max(d, q.y + 0.02 * s), px);
  }

  float h1 = -0.17 + 0.05 * sin(uv.x * 2.6 + 1.0) + 0.02 * sin(uv.x * 6.0 + t * 0.1);
  col = layer(col, vec3(0.88, 0.68, 0.40), uv.y - h1, px);
  col = mix(col, vec3(0.95, 0.80, 0.52), (1.0 - smoothstep(-px, px, uv.y - h1)) * shade(h1 - uv.y, 0.02) * 0.6);
  float h2 = -0.30 + 0.035 * sin(uv.x * 3.4 - 0.6);
  vec3 field = vec3(0.66, 0.42, 0.27);
  float furrow = smoothstep(0.35, 0.5, abs(fract((uv.x * 0.6 - uv.y * 1.8) * 4.0) - 0.5));
  field *= 1.0 - 0.07 * furrow;
  col = layer(col, field, uv.y - h2, px);

  for (int i = 0; i < 3; i++) {
    float fi = float(i);
    float r = 0.05 + 0.008 * fi;
    float bx = -0.30 + 0.30 * fi + 0.02 * sin(t * 0.3 + fi);
    float gy = -0.30 + 0.035 * sin(bx * 3.4 - 0.6) - 0.05 - 0.03 * fi;
    float b = abs(sin(t * 1.5 + fi * 2.1));
    float sq = 1.0 - smoothstep(0.0, 0.3, b);
    vec2 sc = vec2(1.0 + 0.22 * sq, 1.0 - 0.18 * sq);
    float cy = gy + r * sc.y + b * 0.2;
    vec2 e = (uv - vec2(bx + 0.01, gy)) / vec2(r * (1.15 - 0.45 * b), r * 0.28);
    col = mix(col, col * 0.72, 0.55 * shade(length(e) - 1.0, 0.6));
    vec2 q = (uv - vec2(bx, cy)) / sc;
    float d = length(q) - r;
    float ds = length(q - vec2(0.012, -0.015)) - r;
    col = mix(col, col * 0.78, 0.45 * shade(ds, 0.02));
    vec3 bc = vec3(0.95, 0.45, 0.35);
    if (i == 1) bc = vec3(0.25, 0.62, 0.58);
    if (i == 2) bc = vec3(0.98, 0.74, 0.25);
    col = layer(col, bc, d, px);
    col = layer(col, mix(bc, vec3(1.0, 0.96, 0.85), 0.35), max(d, -(length(q - vec2(0.018, -0.018)) - r)), px);
  }

  vec2 vu = gl_FragCoord.xy / u_resolution - 0.5;
  col *= 1.0 - 0.25 * dot(vu, vu);
  col = mix(col, col * vec3(1.03, 1.0, 0.95), 0.5);
  gl_FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
}