GRAPHICA
CURATED

セルラー・ブルーム

by GRAPHICA

PROMPT

呼吸する細胞のモザイク。境界線が光るステンドグラスのように、ゆっくり脈動する

DATE
2026/6/11
SOURCE
CURATED
MODEL
LIKES
28
VIEW SHADER CODE
vec2 hash22(vec2 p) {
  p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
  return fract(sin(p) * 43758.5453);
}

vec3 palette(float t) {
  return vec3(0.42, 0.38, 0.42) + vec3(0.50, 0.42, 0.48) * cos(6.28318 * (vec3(0.9, 1.0, 1.1) * t + vec3(0.05, 0.35, 0.62)));
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;
  float t = iTime * 0.42;
  vec2 p = uv * 2.6;
  vec2 ip = floor(p);
  vec2 fp = fract(p);

  float d1 = 8.0;
  float d2 = 8.0;
  vec2 cellId = vec2(0.0);
  for (int y = -1; y <= 1; y++) {
    for (int x = -1; x <= 1; x++) {
      vec2 g = vec2(float(x), float(y));
      vec2 o = hash22(ip + g);
      o = 0.5 + 0.45 * sin(t + 6.2831 * o);
      vec2 diff = g + o - fp;
      float d = dot(diff, diff);
      if (d < d1) {
        d2 = d1;
        d1 = d;
        cellId = hash22(ip + g);
      } else if (d < d2) {
        d2 = d;
      }
    }
  }
  d1 = sqrt(d1);
  d2 = sqrt(d2);
  float edge = d2 - d1;

  vec3 base = palette(cellId.x * 0.85 + t * 0.05) * (0.22 + 0.55 * (1.0 - d1));
  float line = smoothstep(0.07, 0.0, edge);
  float glow = smoothstep(0.32, 0.0, edge) * 0.35;
  vec3 col = base + (line * 0.85 + glow) * vec3(0.82, 1.0, 0.72);
  col *= 1.0 - 0.35 * dot(uv * 0.55, uv * 0.55);
  fragColor = vec4(max(col, 0.0), 1.0);
}