我觉得我错过了一些非常简单的东西。我有最简单的 CIKernel,它看起来像这样:
extern "C" float4 Simple(coreimage::sampler s) {
float2 current = s.coord();
float2 anotherCoord = float2(current.x + 1.0, current.y);
float4 sample = s.sample(anotherCoord); // s.sample(current) works fine
return sample;
}
(在我看来)将采样器的 x 位置增加 1 并对相邻像素进行采样。我在实践中得到的是一堆带状垃圾(如下图所示)。采样器似乎几乎没有记录,所以我不知道我是否增加了正确的量来前进一个像素。如果我将
anootherCoord
夹到 s.extent()
,奇怪的条带仍然存在。我错过了一些非常简单的东西吗?
coreimage:sampler
的坐标是相对,介于0和1之间,其中[0,0]
是图像的左下角,[1,1]
是图像的右上角。因此,当您添加 1.0
时,您实际上是在定义的图像空间之外进行采样。
Core Image 提供对
coreimage:destination
的访问以获取绝对坐标(像素)中的坐标。只需将目标作为内核函数的最后一个参数(当您使用 apply
调用内核时无需传递任何内容):
extern "C" float4 Simple(coreimage::sampler s, coreimage::destination dest) {
float2 current = dest.coord();
float2 anotherCoord = current + float2(1.0, 0.0);
float4 sample = s.sample(s.transform(anotherCoord));
return sample;
}
dest.coord()
为您提供绝对(像素)空间中的坐标,s.transform
将其转换回(相对)采样器空间。