mightymandel v16

GPU-based Mandelbrot set explorer

fpxx_step_vert.glsl
Go to the documentation of this file.
1 // mightymandel -- GPU-based Mandelbrot Set explorer
2 // Copyright (C) 2012,2013,2014,2015 Claude Heiland-Allen
3 // License GPL3+ http://www.gnu.org/licenses/gpl.html
4 
5 uniform double er2;
6 uniform bool escaped;
7 uniform usampler2D zdz0s;
8 in dvec4 cne0;
9 #ifdef DE
10 in dvec4 zdz0;
11 #else
12 in dvec2 zdz0;
13 #endif
14 in double err0;
15 out dvec4 cne;
16 #ifdef DE
17 out dvec4 zdz;
18 #else
19 out dvec2 zdz;
20 #endif
21 out double err;
22 
23 void main() {
24  if (escaped) {
25  cne = dvec4(cne0.xy, cne0.z + 1.0, 1.0);
26  uvec4 uz0 = texelFetch(zdz0s, ivec2(0, 0), 0);
27  dvec2 z0 = dvec2
28  ( packDouble2x32(uz0.xy), packDouble2x32(uz0.zw) );
29 #ifdef DE
30  uvec4 udz0 = texelFetch(zdz0s, ivec2(0, 1), 0);
31  dvec2 dz0 = dvec2
32  ( packDouble2x32(udz0.xy), packDouble2x32(udz0.zw) );
33  zdz = zdz0 + dvec4(z0, dz0);
34 #else
35  zdz = zdz0 + z0;
36 #endif
37  err = 1.0;
38  } else {
39  dvec2 c = cne0.xy;
40  double n = cne0.z;
41  double e = cne0.w;
42  dvec2 z = zdz0.xy;
43 #ifdef DE
44  dvec2 dz = zdz0.zw;
45 #endif
46  float error = 0.0;
47  int j = 0;
48  for (int i = 0; i < FPXX_STEP_ITERS; ++i) {
49  if (e <= 0.0) {
50  uvec4 uz0 = texelFetch(zdz0s, ivec2(i, 0), 0);
51  dvec2 z0 = dvec2
52  ( packDouble2x32(uz0.xy), packDouble2x32(uz0.zw) );
53 #ifdef DE
54  uvec4 udz0 = texelFetch(zdz0s, ivec2(i, 1), 0);
55  dvec2 dz0 = dvec2
56  ( packDouble2x32(udz0.xy), packDouble2x32(udz0.zw) );
57 #endif
58  // http://www.fractalforums.com/announcements-and-news/pertubation-theory-glitches-improvement/
59  e = cmag2(z0 + z) - er2;
60  if (cmag2(z0 + z) < cmag2(z0) * 1.0e-6) {
61  error += 1.0;
62  }
63  if (! (e <= 0.0)) {
64  z += z0;
65 #ifdef DE
66  dz += dz0;
67 #endif
68  break;
69  }
70  j += 1;
71 #ifdef DE
72  dz = 2.0 * (cmul(dz0, z) + cmul(dz, z) + cmul(dz, z0));
73 #endif
74  z = 2.0 * cmul(z0, z) + csqr(z) + c;
75  } else {
76  break;
77  }
78  }
79  n += double(j);
80  cne = dvec4(c, n, e);
81 #ifdef DE
82  zdz = dvec4(z, dz);
83 #else
84  zdz = dvec2(z);
85 #endif
86  err = err0 + double(error);
87  }
88 }