BLOKS Shader Bulletin Board
global cloud cover
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);
}
