55 lines
1.1 KiB
GLSL
55 lines
1.1 KiB
GLSL
// uniforms
|
|
uniform vec4 gain;
|
|
uniform vec4 bias;
|
|
uniform vec2 seed;
|
|
|
|
uniform vec2 scale;
|
|
uniform vec2 lacunarity;
|
|
uniform vec4 decay;
|
|
uniform int octaves;
|
|
uniform bool premultipliedAlpha;
|
|
|
|
// varyings
|
|
in vec2 v_texCoord0;
|
|
|
|
// outputs
|
|
out vec4 o_output;
|
|
|
|
vec2 hash22(vec2 p) {
|
|
float n = sin(dot(p, vec2(41, 289)));
|
|
return fract(vec2(262144, 32768)*n);
|
|
}
|
|
|
|
float cell(vec2 p) {
|
|
vec2 ip = floor(p);
|
|
p = fract(p);
|
|
|
|
float d = 1.0;
|
|
for (int i = -1; i <= 1; i++) {
|
|
for (int j = -1; j <= 1; j++) {
|
|
vec2 cellRef = vec2(i, j);
|
|
vec2 offset = hash22(ip + cellRef);
|
|
vec2 r = cellRef + offset - p;
|
|
float d2 = dot(r, r);
|
|
d = min(d, d2);
|
|
}
|
|
}
|
|
return d;
|
|
}
|
|
|
|
void main() {
|
|
vec4 result = vec4(0.0);
|
|
vec4 _gain = gain;
|
|
vec2 _scale = scale;
|
|
for (int o = 0; o < octaves; ++o) {
|
|
result += cell((v_texCoord0+seed) * _scale) * _gain;
|
|
_scale *= lacunarity;
|
|
_gain *= decay;
|
|
}
|
|
o_output = result + bias;
|
|
|
|
if (premultipliedAlpha) {
|
|
o_output.rgb *= o_output.a;
|
|
}
|
|
}
|