1varying vec2 v_TexCoord;
2varying vec2 v_Position;
3uniform float u_Time;
4uniform sampler2D u_Tex0;
5uniform sampler2D u_Tex1;
6uniform vec2 u_Resolution;
7const float PI = 3.1415926535897932;
8
9// CONFIG
10float speed = 3.0;
11float height = 10.7;
12float angle = 22.0; // degrees
13float intensity = 0.9;
14// CONFIG END
15
16vec2 rotate(vec2 v, float a) {
17 float s = sin(a);
18 float c = cos(a);
19 mat2 m = mat2(c, -s, s, c);
20 return m * v;
21}
22
23// speed
24const float crystals_speed = 0.16;
25const float crystals_speed_x = 0.13;
26const float crystals_speed_y = 0.12;
27
28// geometry
29const float noise_intensity = 100.;
30const int steps = 9;
31const float frequency = 70.0;
32const int noise_angle = 13; // better when a prime
33
34// reflection and emboss
35const float delta = 500.;
36const float intence = 70.3;
37const float emboss = 3.7;
38
39//---------- crystals effect
40float col(vec2 coord)
41{
42 float delta_theta = 2.0 * PI / float(noise_angle);
43 float col = 0.0;
44 float theta = 0.0;
45
46 for(int i = 0; i < steps; i++) {
47 vec2 adjc = coord;
48 theta = delta_theta*float(i);
49 adjc.x += cos(theta)*u_Time*crystals_speed + u_Time * crystals_speed_x;
50 adjc.y -= sin(theta)*u_Time*crystals_speed - u_Time * crystals_speed_y;
51 col = col + cos( (adjc.x*cos(theta) - adjc.y*sin(theta))*frequency) * noise_intensity;
52 }
53 return cos(col);
54}
55
56void main()
57{
58
59 vec2 p = v_TexCoord, c1 = p, c2 = p;
60 float cc1 = col(c1);
61
62 c2.x += u_Resolution.x/delta;
63 float dx = emboss*(cc1-col(c2))/delta;
64
65 c2.x = p.x;
66 c2.y += u_Resolution.y/delta;
67 float dy = emboss*(cc1-col(c2))/delta;
68
69 c1.x += dx;
70 c1.y += dy;
71
72 float alpha = 1.+dot(dx,dy)*intence;
73
74 gl_FragColor = texture2D(u_Tex0, c1);
75 vec4 texcolor = texture2D(u_Tex0, c1);
76 vec4 effectColor = texture2D(u_Tex1, v_TexCoord);
77
78 vec2 rotated = rotate(v_Position, (angle / 180.0) * PI);
79 float frame = mod(rotated.y, height);
80 float timeFrame = mod(u_Time * speed, height);
81 float dist = min(abs(frame - timeFrame), min(abs(frame - timeFrame - height), abs(frame - timeFrame + height)));
82
83 if(texcolor.a > 0.9) {
84 vec3 tempColor = gl_FragColor.xyz;
85 gl_FragColor.xyz *= max(1.0, 1.0 / max(intensity / sqrt(max(1.0, dist)), 0.1));
86 }
87
88 if(gl_FragColor.a < 0.01) discard;
89}