Metal CoreImage:编写一个reducer过滤器
我正在尝试编写一个CIKernel,它将图像中所有像素的值相加——实际上,将两个Metal CoreImage:编写一个reducer过滤器,metal,core-image,Metal,Core Image,我正在尝试编写一个CIKernel,它将图像中所有像素的值相加——实际上,将两个CIImages之间的绝对差相加为绝对差之和 文档告诉我for循环是非法的,除非谓词可以在编译时测试。图像的范围不能,所以我不确定内核如何迭代样本并累积值。或者这可能吗?我需要在内核之外做最后的求和吗 kernel vec4 coreImageKernel(sampler minuend, sampler subtrahend) { vec4 retval = {0,0,0,0}; if destCoord().x
CIImage
s之间的绝对差相加为绝对差之和
文档告诉我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;
}
kernel vec4 coreImageKernel(采样器分钟数,采样器减数){
vec4 retval={0,0,0};
如果destCoord().x==0&&destCoord().y==0{
int i,j;
对于(i=0;i<采样范围(分钟).w;i++){
对于(j=0;j<采样范围(分钟).h;j++){
vec2 dest={i,j};
vec4 minSample=采样(minuted,samplerTransform(minuted,dest));
vec4子样本=样本(子样本数,采样变换(子样本数,目标));
vec4-sampleDiff=abs(最小样本-子样本);
retval+=采样差;
}
}
}
返回返回;
}
我建议您看看最近引入的Metal直接渲染到CoreImage管道的功能。此示例代码显示了一个名为grayscaleKernel的金属计算内核,它用于将RGBA输入图像转换为灰度像素,这是CoreImage管道中的一个步骤。这是直接渲染,不经过抽象层。github项目是。Hey MoDJ!它是否比使用标准的CIImage
和CIKernel
子类实现更快?()或者在引擎盖下是一样的?你得自己试试看。苹果的实现一直在变化,所以你的结果可能取决于iOS版本。至少在概念上,我的实现是从CoreImage API调用金属渲染的最直接的方法。说到实际性能,任何逻辑中的大部分时间都花在简单地读取和写入着色器中的数据上,因此,对于不同的方法,实际性能可能不会有很大差异。