70 lines
1.3 KiB
GLSL
70 lines
1.3 KiB
GLSL
// Code by Flopine
|
|
// Thanks to wsmind and Leon for teaching me :)
|
|
|
|
|
|
#define PI 3.14
|
|
|
|
mat2 rot (float angle)
|
|
{
|
|
float c = cos(angle);
|
|
float s = sin(angle);
|
|
return mat2 (c,-s,s,c);
|
|
}
|
|
|
|
vec2 moda (vec2 p, float per)
|
|
{
|
|
float angle = atan(p.y,p.x);
|
|
float l = length(p);
|
|
angle = mod(angle-per/2., per)-per/2.;
|
|
return vec2(cos(angle),sin(angle))*l;
|
|
}
|
|
|
|
|
|
float cylY (vec3 p, float r)
|
|
{
|
|
return length(p.xy)-r;
|
|
}
|
|
|
|
float SDF (vec3 p)
|
|
{
|
|
float per = 0.7;
|
|
|
|
p.x = abs(p.x);
|
|
p.xy *= rot(p.z+iTime);
|
|
p.xy = moda(p.xy, (sin(iTime)+2.)*PI/4.);
|
|
|
|
p.yz = mod(p.yz-per/2.,per)-per/2.;
|
|
p.yz *= rot(p.x+iTime);
|
|
|
|
p.x -= .7;
|
|
|
|
return cylY(p,0.2);
|
|
|
|
}
|
|
|
|
void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
|
{
|
|
vec2 uv = 2.*(fragCoord.xy / iResolution.xy)-1.;
|
|
uv.x *= iResolution.x/iResolution.y;
|
|
|
|
vec3 pos = vec3(0.001,0.001,iTime*0.8);
|
|
vec3 dir = normalize(vec3(uv, 1.));
|
|
|
|
float shad = 0.;
|
|
|
|
|
|
for (int i=0; i<100; i++)
|
|
{
|
|
float d = SDF(pos);
|
|
if (d<0.01)
|
|
{
|
|
shad = float(i)/60.;
|
|
break;
|
|
}
|
|
else shad = 0.8;
|
|
pos += d*0.2*dir;
|
|
}
|
|
|
|
vec3 hue = vec3(abs(pos.y)*3.,1.,.5);
|
|
fragColor = vec4(vec3(shad)/hue,1.0);
|
|
}
|