BLOKS Shader Bulletin Board
The Dreaming Machine
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);
}
