#define T (iTime*.5) #define P(z) (vec3((cos((z) * .2) * .3) * 10., \ (cos((z) * .15) * .3) * 10., (z))) #define R(a) mat2(cos(a), -sin(a), sin(a), cos(a)) #define N normalize bool hitRoot = false; // @Shane vec3 tex3D( sampler2D tex, in vec3 p, in vec3 n ){ n = max((abs(n) - 0.2)*7., 0.001); n /= (n.x + n.y + n.z ); return (texture(tex, p.yz)*n.x + texture(tex, p.zx)*n.y + texture(tex, p.xy)*n.z).xyz; } // @Shane: // Commutative smooth minimum function. Provided by Tomkh, and taken // from Alex Evans's (aka Statix) talk: // http://media.lolrus.mediamolecule.com/AlexEvans_SIGGRAPH-2015.pdf // Credited to Dave Smith @media molecule. float smin(float a, float b, float k){ float f = max(0., 1. - abs(b - a)/k); return min(a, b) - k*.25*f*f; } float fractal(vec3 p) { float s,w,l; p.y *= .4; p += cos(p.yzx*12.)*.07; p.x -= 1.6; for (s=0.,w=.7; s++ < 7.; p *= l, w *= l ) p = abs(sin(p))-1., l = 1.5/dot(p,p); return length(p)/w-.0005; } float light(vec3 p) { p.xy -= P(p.z).xy; float t = iTime*.5; return length(p-vec3( tanh(cos(t*1.8)*2.) * .25 , tanh(cos(t*1.)*3.) * .3, 4.+T+tanh(cos(t*.4)*4.)*1. ))-.25; } float root(vec3 p){ p.xy *= R(sin(p.z*2.)*.1 + sin(p.z*1.)*.3); p = mod(p, 1.) - .5; return .6*length(p.xy) - .01; } float map(vec3 p) { float s, r; r = root(p); p.xy -= P(p.z).xy; s = smin(fractal(p), 2. - abs(p.y), .8); hitRoot = r < s; s = min(s, r); return s; } // @iq float AO(in vec3 pos, in vec3 nor) { float sca = 1.9, occ = 0.0; for( int i=0; i<5; i++ ){ float hr = 0.01 + float(i)*0.5/4.0; float dd = map(nor * hr + pos); occ += (hr - dd)*sca; sca *= 0.7; } return clamp( 1.0 - occ, 0.0, 1.0 ); } void mainImage(out vec4 o, in vec2 u) { float s=.1,d=0.,i=0.; vec3 r = iResolution; u = (u-r.xy/2.)/r.y; vec3 e = vec3(.001,0,0), p = P(T),ro=p, Z = N( P(T+1.) - p), X = N(vec3(Z.z,0,-Z)), D = vec3(R(sin(T*.2)*.4)*u, 1) * mat3(-X, cross(X, Z), Z); o = vec4(0); for(;i++ < 128.;) p = ro + D * d * .65, d += s = map(p), o += 4e1*vec4(6,9,1,0) + 1./max(s, .001); r = N(map(p) - vec3(map(p-e.xyy), map(p-e.yxy), map(p-e.yyx))); o.rgb *= tex3D(iChannel0, p*.5, r); o *= o; o *= hitRoot ? .2*vec4(4,3,2,0) : vec4(1); o *= AO(p, r); o = tanh(sqrt(d * o / pow(abs(light(p)), 3.) / 5e9 )); }