如何正确访问金属内核函数中的邻居单元

时间:2016-07-22 08:48:46

标签: ios macos shader metal

我用金属做了一些插值任务。我编写了如下核心函数:

kernel void kf_interpolation( device short *dst, device uchar *src, uint id [[ thread_position_in_grid ]] )    
{
  dst[id] = src[id-1] + src[id] + src[id+1];
}

该内核函数无法给出预期值。我发现原因是src [id-1]始终为0,这是假值。但是,src [id + 1]包含正确的值。问题是如何正确使用邻居单元,例如[id-1],在内核函数中。提前致谢。

2 个答案:

答案 0 :(得分:1)

处理这种边缘情况的最有效方法通常是在每一端增加源数组并偏移索引。因此,对于N次计算,使用N + 2个元素分配src数组,用源数据填充元素1到N(包括),并将元素0和N + 1设置为您想要的边缘条件。

答案 1 :(得分:0)

更有效的方法是使用MTLTextures而不是MTLBuffers。 MTLTextures附加了一个寻址模式,当您读取纹理边缘时,硬件会自动替换零或最近的有效纹理元素。它们也可以在硬件中免费进行线性插值,这对于重新采样非常有帮助,假设双线性插值对您来说足够好。如果没有,我建议将MPSImageLanczosScale作为替代方案。

您可以从MTLBuffer制作MTLTexture。这两个将为相同的像素数据添加别名。