Add torus-thingy.glsl
This commit is contained in:
parent
e96c474e2f
commit
fda6aac3b4
1 changed files with 135 additions and 0 deletions
135
torus-thingy.glsl
Normal file
135
torus-thingy.glsl
Normal file
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* 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
|
Loading…
Add table
Add a link
Reference in a new issue