80 lines
2.2 KiB
GLSL
80 lines
2.2 KiB
GLSL
// INFO: This shader is a port of https://www.shadertoy.com/view/3sySRK
|
|
|
|
// INFO: Change these variables to create some variation in the animation
|
|
#define BLACK_BLEND_THRESHOLD .4 // This is controls the dim of the screen
|
|
#define COLOR_SPEED 0.1 // This controls the speed at which the colors change
|
|
#define MOVEMENT_SPEED 0.1 // This controls the speed at which the balls move
|
|
|
|
float opSmoothUnion( float d1, float d2, float k )
|
|
{
|
|
float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );
|
|
return mix( d2, d1, h ) - k*h*(1.0-h);
|
|
}
|
|
|
|
float sdSphere( vec3 p, float s )
|
|
{
|
|
return length(p)-s;
|
|
}
|
|
|
|
float map(vec3 p)
|
|
{
|
|
float d = 2.0;
|
|
for (int i = 0; i < 16; i++) {
|
|
float fi = float(i);
|
|
float time = iTime * (fract(fi * 412.531 + 0.513) - 0.5) * 2.0;
|
|
d = opSmoothUnion(
|
|
sdSphere(p + sin(time*MOVEMENT_SPEED + fi * vec3(52.5126, 64.62744, 632.25)) * vec3(2.0, 2.0, 0.8), mix(0.5, 1.0, fract(fi * 412.531 + 0.5124))),
|
|
d,
|
|
0.4
|
|
);
|
|
}
|
|
return d;
|
|
}
|
|
|
|
vec3 calcNormal( in vec3 p )
|
|
{
|
|
const float h = 1e-5; // or some other value
|
|
const vec2 k = vec2(1,-1);
|
|
return normalize( k.xyy*map( p + k.xyy*h ) +
|
|
k.yyx*map( p + k.yyx*h ) +
|
|
k.yxy*map( p + k.yxy*h ) +
|
|
k.xxx*map( p + k.xxx*h ) );
|
|
}
|
|
|
|
void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
|
{
|
|
vec2 uv = fragCoord/iResolution.xy;
|
|
|
|
vec3 rayOri = vec3((uv - 0.5) * vec2(iResolution.x/iResolution.y, 1.0) * 6.0, 3.0);
|
|
vec3 rayDir = vec3(0.0, 0.0, -1.0);
|
|
|
|
float depth = 0.0;
|
|
vec3 p;
|
|
|
|
for(int i = 0; i < 64; i++) {
|
|
p = rayOri + rayDir * depth;
|
|
float dist = map(p);
|
|
depth += dist;
|
|
if (dist < 1e-6) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
depth = min(6.0, depth);
|
|
vec3 n = calcNormal(p);
|
|
float b = max(0.0, dot(n, vec3(0.577)));
|
|
vec3 col = (0.5 + 0.5 * cos((b + iTime*COLOR_SPEED * 3.0) + uv.xyx * 2.0 + vec3(0,2,4))) * (0.85 + b * 0.35);
|
|
col *= exp( -depth * 0.15 );
|
|
|
|
|
|
vec2 termUV = fragCoord.xy / iResolution.xy;
|
|
vec4 terminalColor = texture(iChannel0, termUV);
|
|
|
|
float alpha = step(length(terminalColor.rgb), BLACK_BLEND_THRESHOLD);
|
|
vec3 blendedColor = mix(terminalColor.rgb * 1.0, col.rgb * 0.3, alpha);
|
|
|
|
fragColor = vec4(blendedColor, terminalColor.a);
|
|
|
|
}
|
|
|