You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
glsl/colorful_noise_hell.glsl

108 lines
2.6 KiB
GLSL

// Taste of Noise 17 by Leon Denise 2022-05-17
// A very distorted volume
// Playing with a 3D FBM noise
// https://www.shadertoy.com/view/fljBWK
float details;
// rotation matrix
mat2 rot (float a) { return mat2(cos(a),-sin(a),sin(a),cos(a)); }
// shortcut for lighting
#define dt(rn,v,p) pow(dot(rn,normalize(v))*.5+.5,p)
// https://iquilezles.org/articles/distfunctions/
float smin(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); }
// transform linear value into cyclic absolute value
vec3 bend(vec3 v)
{
return abs(sin(v*6.28*2.-iTime*.5));
}
// fractal brownian motion (layers of multi scale noise)
vec3 fbm(vec3 p)
{
vec3 result = vec3(0);
float falloff = 0.5;
for (float index = 0.; index < 3.; ++index)
{
result += bend(texture(iChannel0, p/falloff).xyz) * falloff;
falloff /= 2.;
}
return result;
}
// signed distance function
float map(vec3 p)
{
float d = 0.;
// FBM animated noise
vec3 ps = p * .5;
ps.z += iTime*.1;
vec3 spicy = fbm(ps);
details = spicy.x;
spicy = spicy * 2. - 1.;
// displace volue
d += spicy.x * .8;
// volume to surface
d = abs(d)-.1;
// substract volume from origin
float carve = -1.25+.25*sin(iTime*.1+length(p));
d = smin(d, -(length(p)-0.), carve);
return d * .25;
}
// Antoine Zanuttini
// https://www.shadertoy.com/view/3sBGzV
vec3 getNormal (vec3 pos)
{
vec2 noff = vec2(0.005,0);
return normalize(map(pos)-vec3(map(pos-noff.xyy), map(pos-noff.yxy), map(pos-noff.yyx)));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// coordinates
vec2 uv = (fragCoord.xy - iResolution.xy / 2.)/iResolution.y;
vec3 noise = texture(iChannel1, fragCoord.xy/1024.+iTime).rgb;
vec3 ray = normalize(vec3(uv, .5));
vec3 pos = vec3(0,0,0);
// init variables
vec3 color, normal, tint, dir, refl;
float index, shade, light;
const float count = 50.;
// ray marching
for (index = count; index > 0.; --index)
{
float dist = map(pos);
if (dist < .001) break;
dist *= .9+.1*noise.z;
pos += ray*dist;
}
// lighting
shade = index/count;
normal = getNormal(pos);
tint = .5+.5*cos(vec3(1,2,3)+details*20.);
refl = reflect(ray, normal);
color += tint;
color += vec3(1.000,0.502,0.792)*dt(refl, vec3(0,0,-1), .5);
color = clamp(color * shade, 0., 1.);
// temporal buffer
uv = fragCoord.xy / iResolution.xy;
vec3 frame = texture(iChannel2, uv).rgb;
color = mix(color, frame, .9);
fragColor = vec4(color, 1.);
}