blob: d15ccd0c00d97e469d114706ee4c47b363adf20c (
plain)
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
|
// Used to ID into the 1D array, so that we can use
// it effectively as a 2D array
inline int ID(int x, int y, int width) { return 4*width*y + x*4; }
inline float mapX(float x) { return x*3.25f - 2.f; }
inline float mapY(float y) { return y*2.5f - 1.25f; }
__kernel void compiler_mandelbrot(__global char *out) {
int x_dim = get_global_id(0);
int y_dim = get_global_id(1);
int width = get_global_size(0);
int height = get_global_size(1);
int idx = ID(x_dim, y_dim, width);
float x_origin = mapX((float) x_dim / (float) width);
float y_origin = mapY((float) y_dim / (float) height);
// The Escape time algorithm, it follows the pseduocode from Wikipedia
// _very_ closely
float x = 0.0f;
float y = 0.0f;
int iteration = 0;
// This can be changed, to be more or less precise
int max_iteration = 256;
while(x*x + y*y <= 4 && iteration < max_iteration) {
float xtemp = x*x - y*y + x_origin;
y = 2*x*y + y_origin;
x = xtemp;
iteration++;
}
if(iteration == max_iteration) {
// This coordinate did not escape, so it is in the Mandelbrot set
out[idx] = 0;
out[idx + 1] = 0;
out[idx + 2] = 0;
out[idx + 3] = 255;
} else {
// This coordinate did escape, so color based on quickly it escaped
out[idx] = iteration;
out[idx + 1] = iteration;
out[idx + 2] = iteration;
out[idx + 3] = 255;
}
}
|