【问题标题】:CoreImage: Writing a reducer filterCoreImage:编写reducer过滤器
【发布时间】:2018-11-26 19:17:54
【问题描述】:

我正在尝试编写一个 CIKernel,它对图像中所有像素的值求和——实际上是对两个 CIImages 之间的绝对差求和,就像绝对差之和一样。

文档告诉我,除非可以在编译时测试谓词,否则 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;
}

【问题讨论】:

    标签: metal core-image


    【解决方案1】:

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

    【讨论】:

    • 嘿MoDJ!它比使用标准CIImageCIKernel 子类实现更快吗? (medium.com/@shu223/core-image-filters-with-metal-71afd6377f4) 还是引擎盖下是一样的?
    • 您必须亲自尝试才能看到。 Apple 实施不断变化,因此您的结果可能取决于 iOS 版本。至少在概念上,我的实现是从 CoreImage API 调用 Metal 渲染的最直接的方法。就实际性能而言,任何逻辑中的大部分时间都只是在着色器中读取和写入数据,因此不同方法的实际性能可能没有太大差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2012-09-01
    相关资源
    最近更新 更多