我有一个对图像进行一些变形的 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。但我不知道是否可以检查,因为内核当然是同时执行的。