AI GENERATED

地球

by touyou

PROMPT

波打つ世界

DATE
2026/7/8
SOURCE
AI GENERATED
MODEL
gemini-2.5-flash
LIKES
1
VIEW SHADER CODE
float hash13(vec3 p3) {
    p3  = fract(p3 * vec3(0.1031, 0.11369, 0.13787));
    p3 += dot(p3, p3.yzx + 19.19);
    return fract((p3.x + p3.y) * p3.z);
}

float noise(vec3 p) {
    vec3 i = floor(p);
    vec3 f = fract(p);
    f = f * f * (3.0 - 2.0 * f); // Smoothstep interpolation

    // Get the 8 corner values
    float n000 = hash13(i + vec3(0.0, 0.0, 0.0));
    float n100 = hash13(i + vec3(1.0, 0.0, 0.0));
    float n010 = hash13(i + vec3(0.0, 1.0, 0.0));
    float n110 = hash13(i + vec3(1.0, 1.0, 0.0));
    float n001 = hash13(i + vec3(0.0, 0.0, 1.0));
    float n101 = hash13(i + vec3(1.0, 0.0, 1.0));
    float n011 = hash13(i + vec3(0.0, 1.0, 1.0));
    float n111 = hash13(i + vec3(1.0, 1.0, 1.0));

    // Interpolate along X, then Y, then Z
    float res = mix(
        mix(mix(n000, n100, f.x), mix(n010, n110, f.x), f.y),
        mix(mix(n001, n101, f.x), mix(n011, n111, f.x), f.y),
        f.z
    );
    return res;
}

float fbm(vec3 p) {
    float value = 0.0;
    float amplitude = 0.5;
    float frequency = 1.0;
    // For-loop iteration count is a compile-time constant
    for (int i = 0; i < 5; i++) {
        value += amplitude * noise(p * frequency);
        frequency *= 2.0;
        amplitude *= 0.5;
    }
    return value;
}

vec3 palette(float t) {
    vec3 a = vec3(0.5, 0.5, 0.5);
    vec3 b = vec3(0.5, 0.5, 0.5);
    vec3 c = vec3(1.0, 1.0, 1.0);
    vec3 d = vec3(0.263, 0.416, 0.557); // Blue-ish tones

    // Adjust range and speed for harmonic color transitions
    t = t * 0.8 + 0.1;
    return a + b * cos(6.28318 * (c * t + d));
}

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

    float time = iTime * 0.1; // Slow down animation time

    // Domain Warping for a "wavy" effect
    vec2 warpedUV = uv;
    float warpStrength = 1.2; 
    
    // First warp pass with larger scale
    vec3 p1 = vec3(uv * 1.5, time * 0.5);
    vec2 warpOffset1 = vec2(fbm(p1 + vec3(10.0, 20.0, 30.0)), fbm(p1 + vec3(40.0, 50.0, 60.0)));
    warpedUV += warpOffset1 * warpStrength * 0.2;

    // Second warp pass with finer detail
    vec3 p2 = vec3(warpedUV * 3.0, time * 0.7);
    vec2 warpOffset2 = vec2(fbm(p2 + vec3(70.0, 80.0, 90.0)), fbm(p2 + vec3(100.0, 110.0, 120.0)));
    warpedUV += warpOffset2 * warpStrength * 0.15;

    // Main FBM calculation on the warped coordinates
    // Self-warping on the Z-axis for more organic motion
    float fbmValue = fbm(vec3(warpedUV * 4.0, time * 0.8 + fbm(vec3(warpedUV * 0.5, time * 0.2)) * 0.1));

    // Remap FBM value to a color range for contrast
    float colorT = fbmValue * 1.5 - 0.2; 

    // Get color from the palette
    vec3 col = palette(colorT);

    // Add a subtle glow/luminosity based on the FBM value
    col += smoothstep(0.0, 1.0, fbmValue) * 0.05;

    // Apply a subtle vignette effect
    float len_uv = length(uv);
    float vignette = smoothstep(0.4, 0.9, len_uv); // Inner start, outer end of vignette
    vignette = pow(vignette, 2.0); // Make it fall off faster
    col *= (1.0 - vignette * 0.6); // Apply vignette with strength 0.6

    fragColor = vec4(col, 1.0);
}

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