Vanguard Golf Hole Portal v3

GLSL shader by joeyw_vanguard_hole · created 2026-07-28 · 10s loop · 1 pass

AAA concentric cyan-rim black-void portal. Vinyl/sound-wave ridges + Fresnel glass. NOT fractal.

Tags: 2D, Animation, Portal, Cyan, Void

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
#define M iMouse
#define xm (M.xy/R)
#define nm ((xm.xy-0.5)*vec2(ar,1.)+0.5)
mat2 r2d(float a) {
    return mat2(cos(a),sin(a),-sin(a),cos(a));
}

Buffer A (iChannel0)

void mainImage(out vec4 fragColor, in vec2 fragCoord){
    vec2 uv = (fragCoord - 0.5*iResolution.xy) / iResolution.y;
    // Looking into a deep concentric funnel / vinyl void
    vec3 ro = vec3(0.0, 0.62, 1.72);
    vec3 ta = vec3(0.0, -0.12, 0.0);
    vec3 ww = normalize(ta - ro);
    vec3 uu = normalize(cross(ww, vec3(0.0,1.0,0.0)));
    vec3 vv = cross(uu, ww);
    vec3 rd = normalize(uv.x*uu + uv.y*vv + 1.40*ww);

    float t = 0.0; float hit = 0.0;
    for(int i=0;i<100;i++){
        vec3 p = ro + rd*t;
        float r = length(p.xz);
        // Parabolic bowl + sound-wave / vinyl ridges (NO fractal)
        float bowl = p.y + 0.38 - 0.58*r*r;
        float ridges = 0.017*sin(r*68.0 - iTime*1.45)
                     + 0.004*sin(r*136.0 + iTime*0.4);
        float d = abs(bowl - ridges) - 0.014;
        // Soft cylindrical void throat
        float hole = max(r - 0.21, -p.y - 0.08);
        d = min(d, hole);
        if(d < 0.0015){ hit = 1.0; break; }
        t += clamp(d * 0.85, 0.004, 0.075);
        if(t > 6.5) break;
    }

    vec3 col = vec3(0.0);
    if(hit > 0.5){
        vec3 p = ro + rd*t;
        float r = length(p.xz);
        vec2 e = vec2(0.0022, 0.0);
        vec3 px = p+e.xyy; vec3 mx = p-e.xyy;
        vec3 py = p+e.yxy; vec3 my = p-e.yxy;
        vec3 pz = p+e.yyx; vec3 mz = p-e.yyx;
        float sx = abs(px.y+0.38-0.58*dot(px.xz,px.xz)-0.017*sin(length(px.xz)*68.0-iTime*1.45)-0.004*sin(length(px.xz)*136.0+iTime*0.4))-0.014;
        float smx= abs(mx.y+0.38-0.58*dot(mx.xz,mx.xz)-0.017*sin(length(mx.xz)*68.0-iTime*1.45)-0.004*sin(length(mx.xz)*136.0+iTime*0.4))-0.014;
        float sy = abs(py.y+0.38-0.58*dot(py.xz,py.xz)-0.017*sin(length(py.xz)*68.0-iTime*1.45)-0.004*sin(length(py.xz)*136.0+iTime*0.4))-0.014;
        float smy= abs(my.y+0.38-0.58*dot(my.xz,my.xz)-0.017*sin(length(my.xz)*68.0-iTime*1.45)-0.004*sin(length(my.xz)*136.0+iTime*0.4))-0.014;
        float sz = abs(pz.y+0.38-0.58*dot(pz.xz,pz.xz)-0.017*sin(length(pz.xz)*68.0-iTime*1.45)-0.004*sin(length(pz.xz)*136.0+iTime*0.4))-0.014;
        float smz= abs(mz.y+0.38-0.58*dot(mz.xz,mz.xz)-0.017*sin(length(mz.xz)*68.0-iTime*1.45)-0.004*sin(length(mz.xz)*136.0+iTime*0.4))-0.014;
        vec3 n = normalize(vec3(sx-smx, sy-smy, sz-smz));

        vec3 light = normalize(vec3(0.65+0.2*sin(iTime*0.35), 0.90, 0.32));
        float diff = clamp(dot(n, light), 0.0, 1.0);
        float ndv = clamp(dot(n, -rd), 0.0, 1.0);
        float fres = pow(1.0 - ndv, 2.8);
        float fres2 = pow(1.0 - ndv, 4.5);

        vec3 cyan = vec3(0.14, 0.78, 1.0);
        vec3 deep = vec3(0.015, 0.04, 0.10);
        float voidM = smoothstep(0.29, 0.15, r);
        float throat = smoothstep(0.23, 0.13, r);

        // Layered cloudy transmission along ridge rings
        float rings = 0.5 + 0.5*sin(r*68.0 - iTime*1.45);
        float fine  = 0.5 + 0.5*sin(r*136.0 + iTime*0.4);
        float cloud = smoothstep(0.2, 0.9, rings) * (0.6 + 0.4*fine);

        col = mix(deep*(0.14 + 0.86*diff), vec3(0.0), voidM);
        col *= 1.0 - 0.48*throat;
        // Glass rim + transmission glow
        col += cyan * fres * (0.62 + 0.38*sin(r*42.0 - iTime*1.7));
        col += cyan * fres2 * 0.42 * cloud;
        // Hard cyan lip at void throat
        col += cyan * 0.48 * smoothstep(0.022, 0.0, abs(r-0.21));
        // Soft subsurface scatter on bowl
        col += cyan * 0.09 * cloud * (1.0 - voidM) * (0.4 + 0.6*diff);
        // Fine grain
        float grain = fract(sin(dot(fragCoord.xy + iTime*17.0, vec2(12.9898,78.233))) * 43758.5453);
        col += (grain-0.5) * 0.026 * (1.0 - voidM*0.65);
    } else {
        float vig = smoothstep(1.2, 0.18, length(uv));
        col = vec3(0.01,0.025,0.05)*(1.0-vig)*0.30;
    }
    col = tanh(col * 1.48);
    fragColor = vec4(col, 1.0);
}

More shaders by joeyw_vanguard_hole

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

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

Account

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