Skip to content

global cloud cover

BLOKS Shader Bulletin Board

global cloud cover

By RJ Shelton June 17, 2026

Shader Preview Unavailable

This realtime shader may be too intensive for your current device or browser.

Shader Code
// Septillion Earth - more earth-like
// For BLOKS Shader Display / Viewer

float hash(vec2 p) {
    p = fract(p * vec2(123.34, 456.21));
    p += dot(p, p + 45.32);
    return fract(p.x * p.y);
}

float noise(vec2 p) {
    vec2 i = floor(p);
    vec2 f = fract(p);
    f = f * f * (3.0 - 2.0 * f);

    float a = hash(i);
    float b = hash(i + vec2(1.0, 0.0));
    float c = hash(i + vec2(0.0, 1.0));
    float d = hash(i + vec2(1.0, 1.0));

    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
}

float fbm(vec2 p) {
    float v = 0.0;
    float a = 0.5;

    for (int i = 0; i < 6; i++) {
        v += a * noise(p);
        p *= 2.0;
        a *= 0.5;
    }

    return v;
}

float continentShape(vec2 uv) {
    float n = fbm(uv * vec2(3.2, 1.8));
    n += 0.45 * fbm(uv * vec2(7.5, 3.8));
    n += 0.25 * fbm(uv * vec2(15.0, 8.0));

    float latitude = abs(uv.y - 0.5);
    n -= latitude * 0.28;

    return smoothstep(0.54, 0.62, n);
}

float cloudShape(vec2 uv, float t) {
    float c = fbm(uv * vec2(8.0, 3.5) + vec2(t * 0.012, 0.0));
    c += 0.5 * fbm(uv * vec2(18.0, 8.0) - vec2(t * 0.018, 0.0));

    return smoothstep(0.62, 0.82, c) * 0.52;
}

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

    vec3 color = vec3(0.0);

    float star = step(0.9982, hash(floor(uv * 480.0)));
    color += star * vec3(0.35);

    vec2 center = vec2(0.0, 0.0);
    vec2 p = uv - center;

    float radius = 0.48;
    float r = length(p);

    if (r > radius) {
        fragColor = vec4(color, 1.0);
        return;
    }

    vec2 sphere = p / radius;
    float z = sqrt(max(0.0, 1.0 - dot(sphere, sphere)));
    vec3 normal = normalize(vec3(sphere, z));

    float slowSpin = iTime * 0.007;

    vec2 mapUv;
    mapUv.x = atan(normal.x, normal.z) / 6.2831853 + 0.5 + slowSpin;
    mapUv.y = asin(normal.y) / 3.1415926 + 0.5;

    float land = continentShape(mapUv);
    float clouds = cloudShape(mapUv, iTime);

    vec3 oceanDeep = vec3(0.015, 0.045, 0.12);
    vec3 oceanBright = vec3(0.035, 0.15, 0.32);

    vec3 landGreen = vec3(0.12, 0.23, 0.10);
    vec3 landTan = vec3(0.46, 0.38, 0.22);
    vec3 desert = vec3(0.62, 0.50, 0.32);

    float dry = smoothstep(0.42, 0.65, fbm(mapUv * vec2(5.0, 2.5) + 14.0));
    vec3 landColor = mix(landGreen, landTan, dry);
    landColor = mix(landColor, desert, dry * 0.35);

    vec3 earth = mix(oceanDeep, oceanBright, 0.35 + 0.65 * z);
    //earth = mix(earth, landColor, land);

    float polar = smoothstep(0.78, 0.96, abs(mapUv.y - 0.5) * 2.0);
    earth = mix(earth, vec3(0.82, 0.86, 0.84), polar * 0.45);

    earth = mix(earth, vec3(0.88, 0.90, 0.88), clouds);

    vec3 lightDir = normalize(vec3(-0.35, 0.28, 0.9));
    float light = max(dot(normal, lightDir), 0.0);
    float shade = smoothstep(-0.12, 0.95, light);

    earth *= 0.22 + 1.05 * shade;

    float rim = pow(1.0 - z, 2.2);
    earth += vec3(0.08, 0.22, 0.46) * rim * 1.3;

    float edge = smoothstep(radius, radius - 0.012, r);
    color = mix(color, earth, edge);

    fragColor = vec4(color, 1.0);
}

← Back to Shader Bulletin Board