OFFLINE SYNTH

妖しい水面

by touyou

PROMPT

深い藍色の宇宙に、ゆっくりと渦を巻く星雲。縁がオレンジの光で染まり、奥から白い光が滲む。そしてあらわれる希望の道

DATE
2026/6/13
SOURCE
OFFLINE SYNTH
MODEL
LIKES
0
VIEW SHADER CODE
float gHash(vec2 p) {
  p = fract(p * vec2(234.34, 435.345));
  p += dot(p, p + 34.23);
  return fract(p.x * p.y);
}

vec2 gHash2(vec2 p) {
  p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
  return fract(sin(p) * 43758.5453);
}

float gNoise(vec2 p) {
  vec2 i = floor(p);
  vec2 fr = fract(p);
  vec2 u = fr * fr * (3.0 - 2.0 * fr);
  return mix(
    mix(gHash(i), gHash(i + vec2(1.0, 0.0)), u.x),
    mix(gHash(i + vec2(0.0, 1.0)), gHash(i + vec2(1.0, 1.0)), u.x),
    u.y
  );
}

float gFbm(vec2 p) {
  float v = 0.0;
  float a = 0.5;
  mat2 m = mat2(0.8, -0.6, 0.6, 0.8);
  for (int i = 0; i < 5; i++) {
    v += a * gNoise(p);
    p = m * p * 2.07;
    a *= 0.5;
  }
  return v;
}

vec3 gPalette(float t) {
  return vec3(0.550, 0.320, 0.200) + vec3(0.450, 0.360, 0.260) * cos(6.28318 * (vec3(1.000, 1.000, 1.000) * t + vec3(0.000, 0.120, 0.250)));
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;
  float t = iTime * 0.059;
  vec2 q2 = uv * 3.734;

  vec2 w1 = vec2(gFbm(q2 + t), gFbm(q2 + vec2(5.2, 1.3) - t * 0.7));
  vec2 w2 = vec2(
    gFbm(q2 + 3.661 * w1 + vec2(1.7, 9.2) + t * 0.4),
    gFbm(q2 + 3.661 * w1 + vec2(8.3, 2.8) - t * 0.3)
  );
  float n = gFbm(q2 + 3.661 * w2);

  vec3 col = gPalette(n * 1.422 + length(w1) * 0.2 + 0.282);
  col *= 0.22 + 1.7 * n * n;
  col *= 1.0 - 0.4 * dot(uv * 0.55, uv * 0.55);
  fragColor = vec4(max(col, 0.0), 1.0);
}

ZIP を展開して .playground を Xcode でダブルクリックし、Live View を表示して ▶ を押すとシェーダーがアニメーションします。Metal ソースは Resources/Shader.metal に独立ファイルとして入っているので、Xcode 上で直接編集できます。