forked from parallel101/opengltutor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathperlin.glsl
50 lines (46 loc) · 1.32 KB
/
perlin.glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
vec3 perlin_hash22(vec3 p)
{
p = vec3( dot(p,vec3(127.1,311.7,284.4)),
dot(p,vec3(269.5,183.3,162.2)),
dot(p,vec3(228.3,164.9,126.0)));
return -1.0 + 2.0 * fract(sin(p)*43758.5453123);
}
float perlin_lev1(vec3 p)
{
vec3 pi = floor(p);
vec3 pf = p - pi;
vec3 w = pf * pf * (3.0 - 2.0 * pf);
return .08 + .8 * (mix(
mix(
mix(
dot(perlin_hash22(pi + vec3(0, 0, 0)), pf - vec3(0, 0, 0)),
dot(perlin_hash22(pi + vec3(1, 0, 0)), pf - vec3(1, 0, 0)),
w.x),
mix(
dot(perlin_hash22(pi + vec3(0, 1, 0)), pf - vec3(0, 1, 0)),
dot(perlin_hash22(pi + vec3(1, 1, 0)), pf - vec3(1, 1, 0)),
w.x),
w.y),
mix(
mix(
dot(perlin_hash22(pi + vec3(0, 0, 1)), pf - vec3(0, 0, 1)),
dot(perlin_hash22(pi + vec3(1, 0, 1)), pf - vec3(1, 0, 1)),
w.x),
mix(
dot(perlin_hash22(pi + vec3(0, 1, 1)), pf - vec3(0, 1, 1)),
dot(perlin_hash22(pi + vec3(1, 1, 1)), pf - vec3(1, 1, 1)),
w.x),
w.y),
w.z));
}
float perlin(float p,int n,vec3 a)
{
float total = 0;
for(int i=0; i<n; i++)
{
float frequency = pow(2,i);
float amplitude = pow(p,i);
total = total + perlin_lev1(a * frequency) * amplitude;
}
return total;
}