-
Notifications
You must be signed in to change notification settings - Fork 3
/
os.fbm.jxs
111 lines (93 loc) · 2.72 KB
/
os.fbm.jxs
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<jittershader name="fbm">
<description>
Fractional Brownian Noise
</description>
<param name="time" type="float" default="0." />
<param name="octaves" type="int" default="5" />
<param name="noiseScale" type="vec2" default="1. 1." />
<param name="scale" type="float" default="1." />
<language name="glsl" version="2.1">
<bind param="time" program="fp" />
<bind param="octaves" program="fp" />
<bind param="noiseScale" program="fp" />
<bind param="scale" program="fp" />
<program name="vp" type="vertex" source="sh.passthrudim.vp.glsl" />
<program name="fp" type="fragment">
<![CDATA[
varying vec2 texcoord0;
varying vec2 texdim0;
uniform float time;
uniform vec2 noiseScale;
uniform int octaves;
uniform float scale;
vec3 permute(vec3 x) {
return mod(((x*34.0)+1.0)*x, 289.0);
}
float snoise(vec2 v) {
const vec4 C = vec4(0.211324865405187, 0.366025403784439,
-0.577350269189626, 0.024390243902439);
vec2 i = floor(v + dot(v, C.yy) );
vec2 x0 = v - i + dot(i, C.xx);
vec2 i1;
i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
vec4 x12 = x0.xyxy + C.xxzz;
x12.xy -= i1;
i = mod(i, 289.0);
vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))
+ i.x + vec3(0.0, i1.x, 1.0 ));
vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy),
dot(x12.zw,x12.zw)), 0.0);
m = m*m ;
m = m*m ;
vec3 x = 2.0 * fract(p * C.www) - 1.0;
vec3 h = abs(x) - 0.5;
vec3 ox = floor(x + 0.5);
vec3 a0 = x - ox;
m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );
vec3 g;
g.x = a0.x * x0.x + h.x * x0.y;
g.yz = a0.yz * x12.xz + h.yz * x12.yw;
return 130.0 * dot(m, g);
}
float fbm(in vec2 _st) {
float v = 0.0;
float a = 0.5;
vec2 shift = vec2(100.0);
// Rotate to reduce axial bias
mat2 rot = mat2(cos(0.5), sin(0.5),
-sin(0.5), cos(0.50));
for (int i = 0; i < octaves; i++) {
v += a * snoise(_st * noiseScale);
_st = rot * _st * 2.0 + shift;
a *= 0.5;
}
return v;
}
void main() {
vec2 st = texcoord0 / texdim0;
vec3 color = vec3(0.0);
st = 1.0 - st;
float t = time;
vec2 q = vec2(0.0);
q.x = fbm(st + 0.1 * t);
q.y = fbm(st + vec2(1.0));
vec2 r = vec2(0.0);
r.x = fbm(st + 1.0 * q + vec2(1.7,9.2) + 0.15 * t * 3.0);
r.y = fbm(st + 1.0 * q + vec2(8.3,2.8) + 0.126 * t * 6.0);
float f = fbm(st + r);
color = mix(vec3(0.0),
vec3(1.0),
clamp((f*f)*100.0,0.0,1.0));
color = mix(color,
vec3(0.0),
clamp(length(q),0.0,1.0));
color = mix(color,
vec3(0.0),
clamp(length(r),0.0,1.0));
// color = step(0.5, color);
gl_FragColor = vec4((f * f + color) * scale, 1.0);
}
]]>
</program>
</language>
</jittershader>