Metal CIKernel 采样产生垃圾

问题描述 投票:0回答:1

我觉得我错过了一些非常简单的东西。我有最简单的 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()
,奇怪的条带仍然存在。我错过了一些非常简单的东西吗?

weird cikernel banding

metal core-image
1个回答
0
投票

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
将其转换回(相对)采样器空间。

© www.soinside.com 2019 - 2024. All rights reserved.