CoreImage:编写一个减速器过滤器

时间:2018-11-26 19:17:54

标签: metal core-image

我正在尝试编写一个CIKernel,用于对图像中所有像素的值求和–实际上是对两个CIImage之间的绝对差求和,如绝对差之和。

文档告诉我,除非可以在编译时测试谓词,否则for循环是非法的。图像的范围无法做到,因此我不确定内核如何迭代样本并累加值。还是有可能吗?我是否需要在内核外部进行最终求和?

kernel vec4 coreImageKernel(sampler minuend, sampler subtrahend) {
vec4 retval = {0,0,0,0};
if destCoord().x == 0 && destCoord().y == 0 {

 int i,j;
 for(i = 0; i < samplerExtent(minuend).w ; i++) {
    for(j = 0; j < samplerExtent(minuend).h ; j++) {
      vec2  dest =  {i,j};

      vec4 minSample = sample(minuend   , samplerTransform(minuend,dest));
      vec4 subSample = sample(subtrahend, samplerTransform(subtrahend,dest));

      vec4 sampleDiff = abs(minSample - subSample);
      retval += sampleDiff;
    }
  } 
}
return retval;
}

1 个答案:

答案 0 :(得分:0)

我建议您看一下最近引入的Metal可以直接渲染到CoreImage管道中的功能。此示例代码显示了一个名为grayscaleKernel的Metal计算内核,该内核用于将RGBA输入图像转换为灰度像素,作为CoreImage管道中的步骤。这是直接渲染,没有经过抽象层。 github项目是CoreImageMetalFilter