开发者

Raycaster not working with OpenCL

开发者 https://www.devze.com 2023-03-20 02:00 出处:网络
Momentarily I\'m trying to write a raycaster engine with OpenCL and Java (LWJGL). However on running the kernel, I can not printf, or write to a debug variable for that matter. I have the feeling the

Momentarily I'm trying to write a raycaster engine with OpenCL and Java (LWJGL).

However on running the kernel, I can not printf, or write to a debug variable for that matter. I have the feeling the kernel is abruptly being cut off, also since times reported (outside opencl) are showing very fast results (60fps), faster than in the mandelbrot example!

I'm looking at gDEBugger but, I do not think it will support Java.

Any comments on my code-makeup are very much welcome as well, since I'm a beginner. Also comments on my raycast-mathmatics are also welcome.

#ifdef USE_TEXTURE
    #define OUTPUT_TYPE __write_only image2d_t
#else
    #define OUTPUT_TYPE global uint *
#endif

#define MAX_RAY_LENGTH 1024


bool isSolid(int x, int y, int z, global uchar *objectIsSolidStorage, int width, int height, int depth) {
    uint placex = x / 8;
    uint placey = y / 8;
    uint placez = z / 8;

    uint widthbychar = (width/8);
    uint heightbychar = (height/8);
    int calcbychar = placex + placey * widthbychar + placez * widthbychar * heightbychar;

    int leftover = x % 8;
    uchar solidchar = objectIsSolidStorage[calcbychar];

    if (x > width || y > height || z >> depth ||
        x < 0 || y < 0 || z < 0) return 1;

    if ((solidchar & ( 1 << leftover )) >> leftover) {
        return 1;
    }
    return 0;
}

int getColor(int x, int y, int z)
{
        return 0xFFFFFFFF;
}

kernel void raycast(
        const int width,
        const int height,
        const float positionX,
        const float positionY,
        const float positionZ,
        const float directionX,
        const float directionY,
        const float directionZ,
        OUTPUT_TYPE output,
        global uchar *objectIsSolidStorage,
        const int objectStorageWidth,
开发者_开发知识库        const int objectStorageHeight,
        const int objectStorageDepth,
        global uint *objectColorStorage,
        global uint *smallObjectsMap,
        global uint *hangableObjectsMap,
        global uint *largeObjectsMap,
        const int objectMapWidth,
        const int objectMapHeight,
        const float frustrumAngleX,
        const float frustrumAngleY,
        global char debug
) {

    unsigned int rayx = get_global_id(0);
    unsigned int rayy = get_global_id(1);

    bool hit = false;
    int itr = 0;
    float x = positionX;
    float y = positionY;
    float z = positionZ;

    printf("work");
    int addX = (rayx - width / 2) * frustrumAngleX;
    int addY = (rayy - height / 2) * frustrumAngleY;
    int color = 0xFFAAFF;
    while(!hit) {
        x += addX;
        y += addY;
        z += itr;
        if (MAX_RAY_LENGTH < itr) {
            hit = true;
            color = 0xFFFFFFFF;
            break;
        } else if (isSolid(x,y,z,objectIsSolidStorage,objectStorageWidth,objectStorageHeight,objectStorageDepth)) {
            hit = true;
            color = 0xAAAAAAAA;
            break;
        }
        itr++;
    }

    #ifdef USE_TEXTURE
        float4 oc = (float4)(
            (c & 0xFF) >> 0,
            (c & 0xFF00) >> 8,
            (c & 0xFF0000) >> 16,
            255.0f
        );
        write_imagef(output, (int2)(rayx, rayy), color / 255.0f);
    #else
        output[rayy * width + rayx] = color;
    #endif
}


it's should be applicable for your OpenCL+java development: attach to java process and debugging OpenCL kernels with easy

http://suhorukov.blogspot.com/2011/12/opencl-kernel-debugging-for-java-host.html


you can run it on the CPU for debugging (amd extension)

#pragma OPENCL EXTENSION cl_amd_printf : enable

0

精彩评论

暂无评论...
验证码 换一张
取 消