Project_2026-02-16_11-58-28

GLSL shader by scry · created 2026-02-16 · updated 2026-02-17 · 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.  //1 degree
#define time iTime*2.*pi/10. //sin(time) loops 10 seconds
#define R iResolution.xy //shorthand
#define ar R.x/R.y //aspect ratio
#define M iMouse //shorthand
#define xm (M.xy/R) //normalized mouse
#define nm ((xm.xy-0.5)*vec2(ar,1.)+0.5) //aspect ratio correction
vec3 cs = vec3(1.,2.,3.);
mat2 r2d(float a) {
    return mat2(cos(a),sin(a),-sin(a),cos(a));
}

Buffer A (iChannel0)

float hash(vec2 p) {
    return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
}

float valueNoise(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 value = 0.0;
    float amplitude = 0.5;
    for (int i = 0; i < 4; i++) {
        value += amplitude * valueNoise(p);
        p *= 2.0;
        amplitude *= 0.5;
    }
    return value;
}

float sabs(float x, float k) {
    //float a = abs(x);
    return sqrt(x*x+k)-k;
}
vec2 sabs(vec2 x, float k) {
    //float a = abs(x);
    return sqrt(x*x+k)-k;
}

float sdCone(vec3 p, vec2 c, float h) {
    vec2 q = h*vec2(c.x/c.y,-1.0);
    vec2 w = vec2(length(p.xz), p.y);
    vec2 a = w - q*clamp(dot(w,q)/dot(q,q), 0.0, 1.0);
    vec2 b = w - q*vec2(clamp(w.x/q.x, 0.0, 1.0), 1.0);
    float k = sign(q.y);
    float d = min(dot(a, a),dot(b, b));
    float s = max(k*(w.x*q.y-w.y*q.x),k*(w.y-q.y));
    return sqrt(d)*sign(s);
}

float map(vec3 p) {
    p.z -= 3.+2.*sin(time+3.4);
    p.yz *= r2d(deg*-30.+sin(time+4.5));
    p.xz *= r2d(time);
    float a = 0.1;
    p.y += 1.;
    p.xy *= r2d(time);
    //p.y = sabs(p.y,0.01)-0.1;
    p.xz += vec2(sin(time*4.+p.y),cos(time*4.+p.y));
    float d = 1000.;
    vec3 p_ = p;
    p_.y = sabs(p_.y,0.9)-2.;
    
    d = min(d,sdCone(p_, vec2(sin(a), cos(a)), 20.0)*0.5);
    //p.y += 1.;
    for (int i=0;i<8;i++) {
        p.xz = sabs(p.xz,0.01)-0.2;
        p.xy *= r2d(deg*p.y*1.);
        p.yz *= r2d(deg*p.y*-1.);
        p.yx *= r2d(deg*1.);
        p.zy *= r2d(deg*-1.);
        //vec3 p_ = p;
        p_ = p;
        p_.y = sabs(p_.y,0.9)-1.5;
        d = min(d,sdCone(p_, vec2(sin(a), cos(a)), 20.0)*0.5);
        p.y += 0.5;
    }
    //d = min(d,sdCone(p, vec2(sin(a), cos(a)), 20.0)*0.5);
    return d;
}

vec3 calcNormal(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)
    ));
}

vec2 RM(vec3 ro, vec3 rd) {
    float dO = 0.0;
    float ii = 0.;
    for (int i=0; i<256; i++) {
        vec3 p = ro + rd*dO;
        float dS = map(p);
        dO += dS*0.3;
        ii += 0.08;
        if (dO > 20.0 || dS < 0.001) break;
    }
    return vec2(dO, ii);
}

vec3 getEnvColor(vec2 uv) {
    float n = fbm(uv * 3.0);
    vec3 col = vec3(n);
    //col = mix(vec3(0.1, 0.2, 0.4), vec3(0.8, 0.5, 0.3), n);
    col = sin(cs*1.25+n*20.);
    return col;
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 uv = fragCoord.xy / iResolution.xy;
    uv -= 0.5;
    uv.x *= ar;
    
    vec3 ro = vec3(0.0, 0.0, 0.0);
    vec3 rd = normalize(vec3(uv, 0.5));
    
    vec3 col = getEnvColor(uv)*0.;
    vec3 accum = vec3(0.0);
    float reflectivity = 1.0;
    
    for (int bounce = 0; bounce < 6; bounce++) {
        vec2 res = RM(ro, rd);
        float t = res.x;
        accum += res.y*res.y*0.002;
        if (bounce == 0 && t>= 20.) {
            accum *= 0.;
            accum += res.y*res.y*0.005;
            //accum += res.y*0.1;
            break;
        }
        if (t >= 20.0) {
            accum += reflectivity * getEnvColor(rd.xy * 0.5);
            break;
        }

        vec3 p = ro + rd * t;
        vec3 n = calcNormal(p);
        
        float fresnel = pow(1.0 - max(dot(-rd, n), 0.0), 3.0);
        float metalness = mix(0.9, 0.95, fresnel);
        
        accum += reflectivity * (1.0 - metalness) * vec3(0.8);
        
        ro = p + n * 0.01;
        rd = reflect(rd, n);
        reflectivity *= metalness;
        
    }
    
    col = accum;
    //col +=
    
    fragColor = vec4(col, 1.0);
}

Image

Not used

More shaders by scry

Browse all public shaders · All shaders by scry · ShaderKit home

Vibe Mode BETA
💰 ~0 credits
Uniforms
FPS: 0
Time: 0
Resolution: 0 x 0

Account

FPS: -- Time: -- --×-- 1x