blob: e6583f49872c10eb4cd3bf5d8e4fb096674c26ff (
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
|
/**
* For a description of this algorithm please refer to
* http://en.wikipedia.org/wiki/Mandelbrot_set
* @author Michael Bien
*/
kernel void mandelbrot(
global uint *output,
const int width, const int height,
const float x0, const float y0,
const float x1, const float y1,
global uint *colorMap, const int colorMapSize, const int maxIterations) {
unsigned int ix = get_global_id(0);
unsigned int iy = get_global_id(1);
float r = x0 + ix * (x1-x0) / width;
float i = y0 + iy * (y1-y0) / height;
float x = 0;
float y = 0;
float magnitudeSquared = 0;
int iteration = 0;
while (magnitudeSquared < 4 && iteration < maxIterations) {
float x2 = x*x;
float y2 = y*y;
y = 2 * x * y + i;
x = x2 - y2 + r;
magnitudeSquared = x2+y2;
iteration++;
}
if (iteration == maxIterations) {
output[iy * width + ix] = 0;
}else {
float alpha = (float)iteration / maxIterations;
int colorIndex = (int)(alpha * colorMapSize);
output[iy * width + ix] = colorMap[colorIndex];
// monochrom
// output[iy * width + ix] = 255*iteration/maxIterations;
}
}
|