noise shader
parent
6eda6c8438
commit
e67f755b77
@ -0,0 +1,107 @@
|
||||
// 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.);
|
||||
}
|
||||
Loading…
Reference in New Issue