Arches_1-11-2026
GLSL shader by scry · created 2026-01-12 · 10s loop · 2 passes
This page opens the shader in the ShaderKit browser GLSL editor: edit it live, fork it, or render it to video, GIF or images up to 8K. Also available as a full-screen view and an embeddable player.
Shader source (GLSL)
Common
#define pi acos(-1.)
#define deg pi/180.
#define time iTime*2.*pi/10.
#define R iResolution.xy
#define ar R.x/R.y
vec3 cs = vec3(1.,2.,3.);
mat2 r2d(float a) {
return mat2(cos(a),sin(a),-sin(a),cos(a));
}
Buffer A (iChannel0)
float sdBox(vec3 p, vec3 b) {
vec3 q = abs(p) - b;
return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0);
}
float sdArch(vec3 p, vec2 b, float r) {
vec2 cv = vec2(atan(p.x,p.y),length(p.xy));
cv.y -= r;
float c =sdBox(vec3(cv,p.z),vec3(2.,b.x,b.y));
float d = max(c,-p.y-0.01);
p.x = abs(p.x)-r;
p.y += r;
d = min(d,sdBox(p,vec3(b.x,0.5,b.y)));
//d = max(d,-sdBox(vec3(cv,abs(p.z)-0.1),vec3(pi/2.,0.075,0.02)));
//p.z = abs(p.z)-0.1;
//p.y -= 0.025;
//d = max(d,-sdBox(p,vec3(0.075,0.5,0.02)));
return d;
}
vec4 map(vec3 p) {
float d = 900.;
float zr = 1.5;
p.z += -time/pi;
//p.z += -time;
p.y -= 0.4;
vec3 op = p;
p.z = (fract(p.z*zr-0.5)-0.5)/zr;
d = min(d,sdArch(vec3(p),vec2(0.1),0.5));
//p.z = abs(p.z)-0.15;
//p.x = abs(p.x)-0.03;
d = max(d,-sdArch(vec3(p.xy,abs(p.z)-0.15),vec2(0.075),0.5));
p.y = abs(p.y+0.5)-0.3;
p.y = abs(p.y+0.1)-0.3;
vec3 p1 = p;
p1.x -=0.05;
p1.x += smoothstep(0.2,0.,p.y+0.3)*0.1;
p1.z += smoothstep(0.2,0.,p.y-0.3)*0.002;
d = min(d, sdArch(vec3(p1.xy,abs(p1.z)-0.075),vec2(0.01),0.5));
vec3 p2 = p;
p2.x +=0.05;
p2.x += smoothstep(0.2,0.,p.y+0.3)*-0.1;
p2.z += smoothstep(0.2,0.,p.y-0.3)*-0.002;
p2.z += smoothstep(0.2,0.,p.y-0.9)*0.002;
d = min(d, sdArch(vec3(p2.xy,abs(p2.z)-0.075),vec2(0.01),0.5));
d = min(d, op.y + 1.0);
return vec4(p, d);
}
vec3 getNormal(vec3 p) {
vec2 e = vec2(0.005, 0.0);
return normalize(vec3(
map(p + e.xyy).w - map(p - e.xyy).w,
map(p + e.yxy).w - map(p - e.yxy).w,
map(p + e.yyx).w - map(p - e.yyx).w
));
}
vec2 RM(vec3 ro, vec3 rd) {
float dO = 0.0;
float ii = 0.0;
for (int i=0; i<200; i++) {
vec3 p = ro + rd*dO;
float dS = map(p).w*0.9;
dO += dS;
ii += 1.0; // Can be used for effects based on steps
if (dO > 20.0 || dS < 0.001) break;
}
return vec2(dO, ii);
}
float softShadow(vec3 ro, vec3 rd, float mint, float maxt, float k) {
float res = 1.0;
float t = mint;
for (int i = 0; i < 32; i++) {
float h = map(ro + rd * t).w;
res = min(res, k * h / t);
t += clamp(h, 0.02, 0.2);
if (h < 0.001 || t > maxt) break;
}
return clamp(res, 0.0, 1.0);
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = fragCoord.xy / iResolution.xy;
vec2 tv = uv;
uv -= 0.5;
uv.x *= ar;
vec3 col = vec3(0.);
vec3 ro = vec3(0.0, 0.0, 5.0); // Ray Origin
vec3 rd = normalize(vec3(uv, -0.5)); // Ray Direction
rd.yz *= r2d(deg*-12.);
//rd.z -= 1.;
//rd.xz *= r2d(time);
vec2 d = RM(ro, rd);
float t = d.x; // Distance to hit
vec3 p = ro + rd * t; // Hit point in 3D space
vec3 mp = map(p).xyz;
if (t < 20.0) {
vec3 n = getNormal(p);
vec3 lightPos = vec3(-6.3+sin(time)*8., 1.9+sin(time), 5.5);
vec3 lightDir = normalize(lightPos - p);
float diff = max(dot(n, lightDir), 0.0);
float amb = 0.1;
float shadow = softShadow(p + n * 0.01, lightDir, 0.01, length(lightPos - p), 16.0);
vec3 c = sin(mp.z*pi*100.+mp.y*2.+cs+p.z+1.5)*0.8+0.5;
c *= step(-p.y,0.59);
c += step(p.y,-0.59);
col = c * (amb + diff * shadow);
} else {
col = vec3(0.1, 0.1, 0.15);
}
fragColor = vec4(col, 1.0);
}
Image
Not used
More shaders by scry
- Spiral Nebula Nocturne
- Iridescent Ground Ritual
- Project_2026-08-15_18-22-06
- Project_2026-08-14_16-45-00
- Project_2026-07-24_15-10-23
- Project_2026-07-15_03-18-26
- Glass of Orange Juice (raymarched)
- Project_2026-07-13_00-53-50
- Project_2026-07-10_16-39-54
- Popcorn ceiling
- Project_2026-06-20_15-32-19
- Project_2026-06-25_12-22-43
Browse all public shaders · All shaders by scry · ShaderKit home
Unread comments
×Projects with new comments. Click to open and read.