AI GENERATED

常夜灯と淡い星空

by touyou

PROMPT

真夜中の常夜灯の下、幻想的な星空を夢見ながらまどろむ暗闇。

DATE
2026/6/17
SOURCE
AI GENERATED
MODEL
gemini-2.5-flash
LIKES
0
VIEW SHADER CODE
float hash11(float p) {
    p = fract(p * 0.3183099 + p);
    p = p * (p + 71.0) * 0.0009765625;
    return fract(p);
}

float hash21(vec2 p) {
    p = fract(p * vec2(2345.567, 876.345) + p.yx * vec2(987.654, 123.456));
    return fract(p.x * p.y);
}

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.5453123);
}

float noise(vec2 p) {
    vec2 ip = floor(p);
    vec2 fp = fract(p);
    fp = fp * fp * (3.0 - 2.0 * fp);

    float n00 = hash21(ip);
    float n10 = hash21(ip + vec2(1.0, 0.0));
    float n01 = hash21(ip + vec2(0.0, 1.0));
    float n11 = hash21(ip + vec2(1.0, 1.0));

    float x1 = mix(n00, n10, fp.x);
    float x2 = mix(n01, n11, fp.x);
    return mix(x1, x2, fp.y);
}

float fbm(vec2 p) {
    float f = 0.0;
    float amp = 0.5;
    vec2 shift = vec2(100.0, 200.0);
    mat2 rot_mat = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));
    for (int i = 0; i < 5; i++) {
        f += amp * noise(p);
        p = rot_mat * p * 2.0 + shift;
        amp *= 0.5;
    }
    return f;
}

vec2 rot(vec2 p, float a) {
    return vec2(p.x * cos(a) - p.y * sin(a), p.x * sin(a) + p.y * cos(a));
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;
    vec2 ratio = iResolution.xy / iResolution.y;

    vec3 final_color = vec3(0.0);

    // --- Midnight Darkness Base Color ---
    vec3 base_dark_color = vec3(0.03, 0.01, 0.07); // Deep blue-purple

    // --- Nightlight ---
    vec2 light_pos = vec2(0.0, -0.6); // Slightly below center
    float dist_to_light = length(uv - light_pos);
    float nightlight_intensity = smoothstep(0.4, 0.05, dist_to_light);
    nightlight_intensity *= (0.8 + 0.2 * sin(iTime * 1.5 + dist_to_light * 5.0)); // Subtle pulse/flicker
    vec3 nightlight_emit_color = vec3(1.0, 0.75, 0.5); // Warm yellow/orange

    // --- Dreamy Starry Sky ---
    // Domain warping for a swirling, dreamy effect
    vec2 star_p = uv * 3.0;
    star_p = rot(star_p, iTime * 0.01); // Slow overall rotation
    star_p += 0.5 * fbm(star_p * 0.8 + iTime * 0.02); // First warp layer
    star_p += 0.2 * sin(star_p.yx * 3.0 + iTime * 0.05); // Second warp layer

    // Generate star field using FBM
    float stars = fbm(star_p * 4.0 + iTime * 0.08);
    stars += 0.5 * fbm(star_p * 8.0 - iTime * 0.03); // Finer detail layer
    stars = pow(stars, 5.0); // Sharpen and enhance brighter spots for star-like appearance

    // Subtle twinkling effect
    stars *= (0.7 + 0.3 * sin(iTime * 8.0 + stars * 10.0));

    // Star color palette (subtly shifting)
    vec3 star_color = 0.7 + 0.3 * cos(iTime * 0.2 + vec3(0.0, 1.0, 2.0)); // White-blue stars

    // --- Nebula/Background Swirl ---
    vec2 nebula_p = uv * 0.8;
    nebula_p = rot(nebula_p, iTime * 0.005); // Even slower rotation for background
    nebula_p += 0.3 * sin(nebula_p.yx * 2.0 + iTime * 0.03); // Subtle background warp
    float nebula_val = fbm(nebula_p * 2.0 + iTime * 0.01);
    nebula_val = pow(nebula_val, 2.0); // Soften the nebula appearance

    // Nebula color palette (cosmic blues/purples)
    vec3 nebula_color = 0.5 + 0.5 * cos(iTime * 0.1 + vec3(0.0, 0.6, 1.0));

    // --- Combine Colors ---
    final_color = mix(base_dark_color, nebula_color * 0.5, nebula_val); // Blend nebula into dark background
    final_color += stars * star_color * 1.5; // Add stars

    // Add nightlight illumination
    final_color += nightlight_emit_color * nightlight_intensity;

    // --- Vignette ---
    float len_uv = length(uv * vec2(1.0 / ratio.x, 1.0));
    float vignette = smoothstep(1.0, 0.3, len_uv);
    final_color *= vignette;
    final_color = mix(final_color, vec3(0.0), 0.15 * (1.0 - vignette)); // Darken corners further

    // --- Output ---
    fragColor = vec4(final_color, 1.0);
}

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