我正在尝试编写一个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;
}
答案 0 :(得分:0)
我建议您看一下最近引入的Metal可以直接渲染到CoreImage管道中的功能。此示例代码显示了一个名为grayscaleKernel的Metal计算内核,该内核用于将RGBA输入图像转换为灰度像素,作为CoreImage管道中的步骤。这是直接渲染,没有经过抽象层。 github项目是CoreImageMetalFilter。