81 lines
1.7 KiB
GLSL
81 lines
1.7 KiB
GLSL
// Parameters from our host
|
|
// x: #sceneid.#scenetime (float)
|
|
// y: undefined
|
|
// z: Snare drum intensity (amiga ball radius gain)
|
|
// w: undefined
|
|
uniform vec4 Z;
|
|
|
|
float rnd(vec2 p)
|
|
{
|
|
p.x += p.y * 57.;
|
|
return sin(cos(p.x) * p.x);
|
|
}
|
|
|
|
float scale;
|
|
vec2 hash( vec2 p )
|
|
{
|
|
p = mod(p, scale);
|
|
p = vec2( dot(p,vec2(127.1,311.7)),
|
|
dot(p,vec2(269.5,183.3)) );
|
|
|
|
return -1.0 + 2.0*fract(sin(p)*43758.5453123);
|
|
}
|
|
|
|
float noise( in vec2 p, float s )
|
|
{
|
|
scale = s;
|
|
p *= s;
|
|
vec2 i = floor( p );
|
|
vec2 f = fract( p );
|
|
|
|
vec2 u = f*f*(3.0-2.0*f);
|
|
|
|
return mix( mix( dot( hash( i + vec2(0.0,0.0) ), f - vec2(0.0,0.0) ),
|
|
dot( hash( i + vec2(1.0,0.0) ), f - vec2(1.0,0.0) ), u.x),
|
|
mix( dot( hash( i + vec2(0.0,1.0) ), f - vec2(0.0,1.0) ),
|
|
dot( hash( i + vec2(1.0,1.0) ), f - vec2(1.0,1.0) ), u.x), u.y);
|
|
}
|
|
|
|
float voronoi(vec2 p)
|
|
{
|
|
p = mod(p, 1.0);
|
|
float min1 = 1, min2 = 1; float seed = 10; const int numPoints = 256;
|
|
for (int i = 0; i < numPoints; ++i)
|
|
{
|
|
vec2 pointPos = vec2(rnd(vec2(0, seed++)), rnd(vec2(1, seed++)))*.5+.5;
|
|
//pointPos += vec2(sin(Z.z+rnd(vec2(0, seed++))), cos(Z.z+rnd(vec2(1, seed++))))*0.1;
|
|
vec2 d = abs(p - pointPos);
|
|
vec2 s = step(0.5, d);
|
|
d = s+d*(-s*2+1);
|
|
float dist = length(d);
|
|
if (dist < min2)
|
|
{
|
|
if (dist < min1)
|
|
{
|
|
min2 = min1;
|
|
min1 = dist;
|
|
}
|
|
else
|
|
{
|
|
min2 = dist;
|
|
}
|
|
}
|
|
}
|
|
|
|
//return pow(1.0 - (min2 - min1), 32.0);
|
|
return (min2 - min1) * 8.0;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
vec2 p = gl_FragCoord.xy / Z.xy;
|
|
float l = voronoi(p);
|
|
|
|
float f = 0.5;
|
|
float seed = 10.0;
|
|
for (float t = 2.0; t <= Z.x; t *= 2.0)
|
|
{
|
|
f += (0.5 / pow(t, 0.6)) * noise(p,t);
|
|
}
|
|
gl_FragColor = vec4(l,f,l,1);
|
|
} |