Skip to content

The Dreaming Machine

BLOKS Shader Bulletin Board

The Dreaming Machine

By Hal Revs June 10, 2026

Shader Preview Unavailable

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

Shader Code
#define PI 3.14159265359

mat2 rot(float a)
{
    float c = cos(a);
    float s = sin(a);
    return mat2(c,-s,s,c);
}

float machine(vec3 p)
{
    float t = iTime * 0.25;

    p.xy *= rot(t * 0.3);
    p.xz *= rot(t * 0.2);

    vec3 q = p;

    q = abs(q);
    q -= 1.0;

    float rings =
        abs(length(q.xy) - 1.0);

    float pipes =
        min(
            length(q.xy) - 0.15,
            min(
                length(q.yz) - 0.15,
                length(q.xz) - 0.15
            )
        );

    float core =
        length(p) - 0.5;

    return min(
        min(rings, pipes),
        core
    );
}

float map(vec3 p)
{
    float d = machine(p);

    vec3 r = mod(p, 4.0) - 2.0;

    d = min(d, machine(r));

    return d;
}

vec3 getNormal(vec3 p)
{
    vec2 e = vec2(0.001,0.0);

    return normalize(vec3(
        map(p+e.xyy)-map(p-e.xyy),
        map(p+e.yxy)-map(p-e.yxy),
        map(p+e.yyx)-map(p-e.yyx)
    ));
}

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

    vec3 ro = vec3(
        sin(iTime*0.15)*2.0,
        cos(iTime*0.10)*1.5,
        -6.0 + iTime*0.5
    );

    vec3 rd =
        normalize(vec3(uv,1.5));

    vec3 col = vec3(0.0);

    float t = 0.0;

    for(int i=0;i<120;i++)
    {
        vec3 p = ro + rd*t;

        float d = map(p);

        if(d<0.001)
        {
            vec3 n = getNormal(p);

            float glow =
                0.5 +
                0.5*sin(
                    p.z*0.5 +
                    iTime
                );

            col =
                vec3(
                    0.2,
                    0.6,
                    1.0
                ) * glow;

            col +=
                pow(
                    max(n.z,0.0),
                    8.0
                );

            break;
        }

        t += d * 0.7;

        if(t>40.0) break;
    }

    col += vec3(
        0.02,
        0.04,
        0.08
    );

    fragColor = vec4(col,1.0);
}

← Back to Shader Bulletin Board