0.00
60.0 fps

Log in to post a comment.

#version 300 es
precision highp float;

uniform float iTime;
uniform vec2  iResolution;
out vec4 fragColor;

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

// Basic value noise with smoother interpolation
float valueNoise(vec2 p) {
    vec2 i = floor(p);
    vec2 f = fract(p);
    
    float a = hash(i + vec2(0.0, 0.0));
    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));

    vec2 u = f * f * (3.0 - 2.0 * f);  // smootherstep
    return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
}

// fbm with zoomed-in detail
float fbm(vec2 p) {
    float total = 0.0;
    float amplitude = 0.6;
    float frequency = 1.0;
    for (int i = 0; i < 5; i++) {
        total += valueNoise(p * frequency) * amplitude;
        frequency *= 2.2;
        amplitude *= 0.5;
    }
    return total;
}

void main() {
    vec2 uv = gl_FragCoord.xy / iResolution.xy;
    uv = uv * 2.0 - 1.0;
    uv.x *= iResolution.x / iResolution.y;

    // Tilted surface
    mat2 skew = mat2(1.0, -0.4, 0.0, 1.0);
    vec2 viewUV = skew * uv;

    // Scrolling
    vec2 pan = vec2(iTime * 0.4, iTime * 0.2);
    vec2 worldUV = viewUV * 4.0 + pan; // 🔍 Zoomed in from 8.0 to 4.0

    // Bump height
    float h = fbm(worldUV);

    // Normal from height map
    float eps = 0.005;
    float hx = fbm(worldUV + vec2(eps, 0.0));
    float hy = fbm(worldUV + vec2(0.0, eps));
    vec3 n = normalize(vec3(h - hx, h - hy, eps));

    // Light and view
    float time = iTime * 0.8;
    vec3 lightDir = normalize(vec3(sin(time * 1.7), cos(time * 2.1), 1.2));
    vec3 viewDir = vec3(0.0, 0.0, 1.0);

    float diff = max(dot(n, lightDir), 0.0);
    float spec = pow(max(dot(n, normalize(lightDir + viewDir)), 0.0), 60.0);

    // Color from height
    vec3 baseColor = mix(vec3(0.1, 0.1, 0.2), vec3(0.9, 0.85, 0.7), h);
    vec3 color = baseColor * diff + vec3(1.0) * spec * 0.6;

    fragColor = vec4(color, 1.0);
}