我正在尝试创建自定义cifilter(如adobe的warp过滤器)。如何只将几个像素(在ROI中)移动到内核语言中的其他位置?也许有人可以建议我一些关于它的信息?我已经阅读了关于创建自定义cifilter的所有Apple文档,但是没有找到该类型过滤器的内核部分的任何类似示例。有一些CIF过滤器可以做类似的事情(比如CITwirlDistortion,CIBumpDistortion)。也许有一些地方我可以找到他们的内核?
答案 0 :(得分:4)
你必须反过来这样做。而不是说我想将这些输入像素放在输出中的这个位置,你必须回答这个输出像素输入中像素的问题。
看看这个内核:
kernel vec4 coreImageKernel(sampler image, float minX, float maxX, float shift)
{
vec2 coord = samplerCoord( image );
float x = coord.x;
float inRange = compare( minX - x, compare( x - maxX, 1., 0. ), 0. );
coord.x = coord.x + inRange * shift;
return sample( image, coord );
}
它将minX和maxX之间的垂直条纹替换为向右移动像素的图像内容。使用minX = 100的内核,maxX = 300和shift = 500会在左下角显示图像。原文在右上角。
因此效果是您将范围内的像素(minX + shift,maxX + shift)移动到(minX,maxX)