123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- precision highp float;
- #define iterations 15
- #define formuparam 0.53
- #define volsteps 20
- #define stepsize 0.1
- #define tile 0.850
- #define brightness 0.0015
- #define darkmatter 0.400
- #define distfading 0.730
- #define saturation 0.850
- varying vec2 vPosition;
- varying vec2 vUV;
- uniform float time;
- uniform float alpha;
- uniform float beta;
- uniform float zoom;
- void main()
- {
- vec3 dir = vec3(vUV * zoom, 1.);
- float localTime = time * 0.0001;
- // Rotation
- mat2 rot1 = mat2(cos(alpha), sin(alpha), -sin(alpha), cos(alpha));
- mat2 rot2 = mat2(cos(beta), sin(beta), -sin(beta), cos(beta));
- dir.xz *= rot1;
- dir.xy *= rot2;
- vec3 from = vec3(1., .5, 0.5);
- from += vec3(localTime*2., localTime, -2.);
- from.xz *= rot1;
- from.xy *= rot2;
- //volumetric rendering
- float s = 0.1, fade = 1.;
- vec3 v = vec3(0.);
- for (int r = 0; r < volsteps; r++) {
- vec3 p = from + s*dir*.5;
- p = abs(vec3(tile) - mod(p, vec3(tile*2.))); // tiling fold
- float pa, a = pa = 0.;
- for (int i = 0; i < iterations; i++) {
- p = abs(p) / dot(p, p) - formuparam; // the magic formula
- a += abs(length(p) - pa); // absolute sum of average change
- pa = length(p);
- }
- float dm = max(0., darkmatter - a*a*.001); //dark matter
- a *= a*a; // add contrast
- if (r > 6) fade *= 1. - dm; // dark matter, don't render near
- //v+=vec3(dm,dm*.5,0.);
- v += fade;
- v += vec3(s, s*s, s*s*s*s)*a*brightness*fade; // coloring based on distance
- fade *= distfading; // distance fading
- s += stepsize;
- }
- v = mix(vec3(length(v)), v, saturation); //color adjust
- gl_FragColor = vec4(v*.01, 1.);
- }
|