Pulse Temple
Audio-reactive sacred geometry field with mouse-driven orbit pressure.
Shader Preview Unavailable
This realtime shader may be too intensive for your current device or browser.
Shader Code
/*
@title Pulse Temple
@author bobber
@description Audio-reactive sacred geometry field with mouse-driven orbit pressure.
@category audio-reactive
@tags audio, mouse, geometry, neon, members
@audio true
@mouse true
@featured false
@version 1.0.0
@license BLOKS Members
*/
#define PI 3.14159265359
#define TAU 6.28318530718
mat2 rot(float a) {
float c = cos(a);
float s = sin(a);
return mat2(c, -s, s, c);
}
float ring(vec2 p, float r, float w) {
return 1.0 - smoothstep(w, w + 0.012, abs(length(p) - r));
}
float spoke(vec2 p, float n, float w) {
float a = atan(p.y, p.x);
float d = abs(sin(a * n));
return smoothstep(w, 0.0, d * length(p));
}
vec3 palette(float t) {
return 0.5 + 0.5 * cos(TAU * (t + vec3(0.0, 0.22, 0.48)));
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
float t = iTime;
float audio = clamp(uAudioLevel, 0.0, 1.0);
float bass = clamp(uAudioBass, 0.0, 1.0);
float mid = clamp(uAudioMid, 0.0, 1.0);
float high = clamp(uAudioHigh, 0.0, 1.0);
vec2 pointer = (uPointer * 2.0 - 1.0);
pointer.x *= iResolution.x / iResolution.y;
float mousePull = exp(-length(uv - pointer) * 2.5);
float dragPulse = length(uPointerDelta) * 8.0;
vec2 p = uv;
p *= rot(t * 0.08 + bass * 0.5 + mousePull * 0.4);
float zoom = 1.0 + bass * 0.18 + dragPulse * 0.08;
p *= zoom;
float field = 0.0;
for (int i = 0; i < 7; i++) {
float fi = float(i);
vec2 q = p;
q *= rot(fi * TAU / 7.0 + t * 0.05);
q.x = abs(q.x);
float r = 0.18 + fi * 0.105 + bass * 0.035 * sin(t * 2.0 + fi);
field += ring(q, r, 0.018 + high * 0.018) * (1.0 - fi * 0.08);
field += spoke(q, 3.0 + mod(fi, 4.0), 0.035 + mid * 0.04) * 0.18;
}
float center = exp(-dot(p, p) * (3.5 - bass));
float aura = exp(-length(uv) * (1.65 - audio * 0.35));
field += center * (0.7 + bass * 1.4);
field += mousePull * (0.35 + high * 0.8);
vec3 color = palette(length(p) * 0.18 - t * 0.045 + audio * 0.2);
vec3 col = color * field;
col += vec3(0.05, 0.12, 0.28) * aura;
col += vec3(0.25, 0.55, 1.0) * mousePull * (0.25 + high);
col = 1.0 - exp(-col * 1.35);
col = pow(col, vec3(0.92));
fragColor = vec4(col, 1.0);
}
