CoreImage: написание фильтра-редуктора - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь написать 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 голосов
/ 28 ноября 2018

Я бы посоветовал вам взглянуть на недавно появившуюся возможность Metal визуализировать прямо в конвейер CoreImage.В этом примере кода показано ядро ​​вычислений Metal с именем grayscaleKernel, оно используется для преобразования входного изображения RGBA в пиксели оттенков серого в качестве шага в конвейере CoreImage.Это прямой рендеринг, он не проходит через уровень абстракции.Проект github: CoreImageMetalFilter .

...