ledbanner-shaders/torus-thingy.glsl
2018-05-19 16:06:46 +02:00

135 lines
2.8 KiB
GLSL

/*
* License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
* Created by bal-khan
*/
vec2 march(vec3 pos, vec3 dir);
vec3 camera(vec2 uv);
void rotate(inout vec2 v, float angle);
vec3 calcNormal( in vec3 pos, float e, vec3 dir);
float loop_circle(vec3 p);
float circle(vec3 p, float phase);
float sdTorus( vec3 p, vec2 t, float phase );
float mylength(vec2 p);
float nrand( vec2 n );
float t; // time
vec3 ret_col; // torus color
vec3 h; // light amount
#define I_MAX 200.
#define E 0.00001
#define FAR 15.
#define PI 3.14
void mainImage(out vec4 c_out, in vec2 f)
{
t = iTime*.125;
vec3 col = vec3(0., 0., 0.);
vec2 R = iResolution.xy,
uv = vec2(f-R/2.) / R.x;
vec3 dir = camera(uv);
vec3 pos = vec3(.0, .0, 0.0);
pos.z = 4.5+1.5*sin(t*10.);
h*=0.;
vec2 inter = (march(pos, dir));
if (inter.y <= FAR)
col.xyz = ret_col*(1.-inter.x*.0025);
else
col *= 0.;
col += h*.005125;
c_out = vec4(col,1.0);
}
float scene(vec3 p)
{
float var;
float mind = 1e5;
p.z += 2.;
rotate(p.xz, 1.57-.5*iTime);
rotate(p.yz, 1.57-.5*iTime);
vec2 q = vec2(mix(mylength(p.xy), length(p.xy), abs(sin(iTime)) )-2.,p.z);
var = atan(p.x,p.y);
rotate(q, var+iTime*2.);
q = abs(q)-.5;
rotate(q, var*-3.+iTime*2.);
var = cos(floor(var*6.)*.5+iTime*3. );
ret_col = 1.-vec3(.5-var*.5, .5, .3+var*.5);
mind = mylength(q)-.125-.1*var;
h += vec3(.5,.8,.5)*(var!=0.?0.:1.)*vec3(1.)*.0125/(.01+(mind-var*.1)*(mind-var*.1) );
h += vec3(.5,.8,.5)*(var!=0.?1.:0.)*vec3(1.)*.0125/(.01+mind*mind);
return (mind);
}
vec2 march(vec3 pos, vec3 dir)
{
vec2 dist = vec2(0.0, 0.0);
vec3 p = vec3(0.0, 0.0, 0.0);
vec2 s = vec2(0.0, 0.0);
for (float i = -1.; i < I_MAX; ++i)
{
p = pos + dir * dist.y;
dist.x = scene(p);
dist.y += dist.x*.2; // makes artefacts disappear
if (dist.x < E || dist.y > FAR)
{
break;
}
s.x++;
}
s.y = dist.y;
return (s);
}
float mylength(vec2 p)
{
float ret;
p = p*p*p*p;
p = p*p;
ret = (p.x+p.y);
ret = pow(ret, 1./8.);
return ret;
}
// Utilities
void rotate(inout vec2 v, float angle)
{
v = vec2(cos(angle)*v.x+sin(angle)*v.y,-sin(angle)*v.x+cos(angle)*v.y);
}
vec2 rot(vec2 p, vec2 ang)
{
float c = cos(ang.x);
float s = sin(ang.y);
mat2 m = mat2(c, -s, s, c);
return (p * m);
}
vec3 camera(vec2 uv)
{
float fov = 1.;
vec3 forw = vec3(0.0, 0.0, -1.0);
vec3 right = vec3(1.0, 0.0, 0.0);
vec3 up = vec3(0.0, 1.0, 0.0);
return (normalize((uv.x) * right + (uv.y) * up + fov * forw));
}
vec3 calcNormal( in vec3 pos, float e, vec3 dir)
{
vec3 eps = vec3(e,0.0,0.0);
return normalize(vec3(
march(pos+eps.xyy, dir).y - march(pos-eps.xyy, dir).y,
march(pos+eps.yxy, dir).y - march(pos-eps.yxy, dir).y,
march(pos+eps.yyx, dir).y - march(pos-eps.yyx, dir).y ));
}
// https://www.shadertoy.com/view/4lXBWj