|
17 | 17 | // Algorithm using fma for faster dd multimplication |
18 | 18 | // More information: https://github.com/munrocket/double.js |
19 | 19 |
|
| 20 | +// MIT License. © 2022 munrocket |
| 21 | +// |
| 22 | +// Emulated double precision lib with mandelbrot set |
| 23 | +// Bottom is always pixelated, top is smooth with double |
| 24 | +// Algorithm using fma for faster dd multimplication |
| 25 | +// Additional information: https://github.com/munrocket/double.js |
| 26 | +
|
20 | 27 | float add(float a, float b) { return (b != 0.) ? a + b : a; } |
21 | 28 | float sub(float a, float b) { return (b != 0.) ? a - b : a; } |
22 | 29 | float mul(float a, float b) { return (b != 1.) ? a * b : a; } |
|
47 | 54 | } |
48 | 55 |
|
49 | 56 | vec2 sub22(vec2 X, vec2 Y) { |
50 | | - return add22(X, -Y); |
| 57 | + vec2 S = twoSum(X[0], -Y[0]); |
| 58 | + vec2 T = twoSum(X[1], -Y[1]); |
| 59 | + vec2 V = fastTwoSum(S[0], add(S[1], T[0])); |
| 60 | + return fastTwoSum(V[0], add(T[1], V[1])); |
51 | 61 | } |
52 | 62 |
|
53 | 63 | vec2 mul22(vec2 X, vec2 Y) { |
|
58 | 68 | } |
59 | 69 |
|
60 | 70 | vec2 div22(vec2 X, vec2 Y) { |
61 | | - float s = X[0] / Y[0]; |
| 71 | + float s = div(X[0], Y[0]); |
62 | 72 | vec2 T = twoProd(s, Y[0]); |
63 | | - float e = ((((X[0] - T[0]) - T[1]) + X[1]) - s * Y[1]) / Y[0]; |
64 | | - return fastTwoSum(s, e); |
| 73 | + float c = add(sub(sub(X[0], T[0]), T[1]), X[1]); |
| 74 | + return fastTwoSum(s, div(sub(c, mul(s, Y[1])), Y[0])); |
65 | 75 | } |
66 | 76 |
|
67 | 77 | //////// end of the library, begin mandelbrot example ///////// |
68 | 78 |
|
| 79 | +//////// end of the library, begin mandelbrot example ///////// |
| 80 | +
|
69 | 81 | vec4 dcadd(vec4 a, vec4 b){ |
70 | 82 | return vec4(add22(a.xy, b.xy), add22(a.zw, b.zw)); |
71 | 83 | } |
|
87 | 99 | return vec4(mul22(c.xy, k), mul22(c.zw, k)); |
88 | 100 | } |
89 | 101 |
|
90 | | -const float zoom = 7.4e5; |
| 102 | +#define zoom 7.4e5 |
91 | 103 | const vec4 p0 = vec4(-0.2351255, -1e-8, 0.8272157, -1e-9); |
92 | | -const vec4 color = vec4(1, 2, 2.9,0); |
93 | 104 | vec2 d(float a) { return vec2(a, 0); } |
94 | 105 | vec4 dc(vec2 c) { return vec4(c.x, 0, c.y, 0); } |
| 106 | +vec4 col(float i) { |
| 107 | + return .1+.9*cos(log(i*i)*vec4(1, 2, 2.9,0)); |
| 108 | +} |
95 | 109 |
|
96 | 110 | vec4 single_fractal(vec4 o) { |
97 | 111 | vec2 c = iResolution.xy, z = gl_FragCoord.xy; |
98 | | - c = z = (z-.5*c)/c.y/zoom + p0.xz; |
| 112 | + c = z = (z-.5*c)/(zoom)/c.y + p0.xz; |
99 | 113 | for (float i; i < 1.; i += 1e-3) { |
100 | | - dot(z = mat2(z,-z.y,z.x)*z + c, z) > 4. ? o = cos(color*log(i*i)) : o; |
| 114 | + if(dot(z = mat2(z,-z.y,z.x)*z + c, z) > 4.) |
| 115 | + o = col(i); |
101 | 116 | } |
102 | 117 | return o; |
103 | 118 | } |
104 | 119 |
|
105 | 120 | vec4 double_fractal(vec4 o) { |
106 | 121 | vec2 c0 = iResolution.xy, z0 = gl_FragCoord.xy; |
107 | | - vec4 z, c = z = dcadd( |
108 | | - fcmul(dcsub(dc(z0), dc(.5*c0)), div22(d(1.), twoProd(c0.y, zoom))), p0); |
| 122 | + vec4 z, c = z = dcadd(fcmul(dcsub(dc(z0), dc(.5*c0)), |
| 123 | + div22(d(1.), twoProd(c0.y, zoom))), p0); |
109 | 124 | for (float i; i < 1.; i += 1e-3) { |
110 | | - dclen(z = dcadd(dcmul(z, z), c)).x > 4. ? o = cos(color*log(i*i)) : o; |
| 125 | + if(dclen(z = dcadd(dcmul(z, z), c)).x > 4.) |
| 126 | + o = col(i); |
111 | 127 | } |
112 | 128 | return o; |
113 | 129 | } |
114 | 130 |
|
115 | 131 | void mainImage( out vec4 o, in vec2 fc ) { |
116 | | - if (fc.y / iResolution.y + fc.x / iResolution.x < 1.) { |
| 132 | + vec2 uv = fc / iResolution.xy; |
| 133 | + if (uv.x + uv.y < 1.) { |
117 | 134 | o = single_fractal(o); |
118 | 135 | } else { |
119 | 136 | o = double_fractal(o); |
120 | 137 | } |
121 | | - o += .02; |
| 138 | + o -= smoothstep(.0025, .001, abs(uv.x+uv.y-1.)) |
122 | 139 | } |
123 | 140 | `); |
124 | 141 | </script> |
|
0 commit comments