lwjgl/src/java/org/lwjgl/test/opencl/gl/Mandelbrot.cl

55 lines
1.5 KiB
Common Lisp

#ifdef DOUBLE_FP
#ifdef AMD_FP
#pragma OPENCL EXTENSION cl_amd_fp64 : enable
#else
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#endif
typedef double varfloat;
#else
typedef float varfloat;
#endif
/**
* For a description of this algorithm please refer to
* http://en.wikipedia.org/wiki/Mandelbrot_set
* @author Michael Bien
*/
kernel void mandelbrot(
const int width, const int height,
const varfloat x0, const varfloat y0,
const varfloat rangeX, const varfloat rangeY,
global uint *output, global uint *colorMap,
const int colorMapSize, const int maxIterations) {
unsigned int ix = get_global_id(0);
unsigned int iy = get_global_id(1);
varfloat r = x0 + ix * rangeX / width;
varfloat i = y0 + iy * rangeY / height;
varfloat x = 0;
varfloat y = 0;
varfloat magnitudeSquared = 0;
int iteration = 0;
while (magnitudeSquared < 4 && iteration < maxIterations) {
varfloat x2 = x*x;
varfloat 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 {
varfloat alpha = (varfloat)iteration / maxIterations;
int colorIndex = (int)(alpha * colorMapSize);
output[iy * width + ix] = colorMap[colorIndex];
// monochrom
// output[iy * width + ix] = 255*iteration/maxIterations;
}
}