0

我有一个对图像进行一些变形的 opencl 内核。这是一个前向映射,每个内核实例处理源图像中一个像素的映射/变形。这意味着一些内核实例(源图像中的像素)映射到相同的目标像素。这意味着我无法控制将什么值写入目标图像中的这些像素。他们只是获取最后执行写入命令的内核实例的值。有没有办法检查我是否正在写入已经写入的位置(像素)?我有我正在变形的图像的深度图,理想情况下,如果更多像素映射到同一位置,我想写最前面的像素,这可能吗?

__kernel void dwarpIntThree(__read_only image2d_t src,
        __read_only image2d_t dispmap,
        float T,
        __write_only image2d_t dst,
        sampler_t sampler,
        int dmin, int dmax,
        sampler_t sampler_1, float posx, float posy
                    ){
int2 srcCoords = (int2)( get_global_id(0), get_global_id(1));

if ((srcCoords.x >= get_image_width(dst)) | (srcCoords.y >= get_image_height(dst)))
    return;

float true_depth = round((read_imagef(dispmap, sampler, srcCoords).x)*(dmax-dmin)+dmin);

int2 uv;
uv.x = srcCoords.x-true_depth*(posx/T);
uv.y = srcCoords.y-true_depth*(posy/T);

if ((uv.x >= get_image_width(dst)) || (uv.y >=get_image_height(dst))| (uv.x < 0) | (uv.y < 0)){
    return;}

float4 srcPixel = read_imagef(src, sampler, srcCoords);

write_imagef(dst, uv, srcPixel);
}

所以我想做的是只将src中的当前像素write_imagef写入dst中的坐标uv,如果它的深度小于来自src的可能像素,它也映射到uv。但我不知道是否可以检查,因为内核当然是同时执行的。

4

1 回答 1

1

这是困难的。一方面,输出图像是只写的。如果您改用读写缓冲区,那么工作项之间就会出现争用。原子操作可以解决这个问题,但速度很慢。

是否可以重新架构以使用反向映射?您必须更改深度图所代表的内容。

我认为使用 OpenGL 和利用深度缓冲区会更合适。

于 2013-06-02T15:09:05.053 回答