将 Core Image Kernel Language 函数转换为 Metal Shading Language

Convert Core Image Kernel Language function to Metal Shading Language

我在 Core Image Kernel Language 中有以下函数,我需要 Metal Shading Language 中的等效函数,但我在使用 destCoord 、unpremultiply 和 premultiply 函数时遇到问题。

kernel vec4 MyFunc(sampler src, __color color, float distance, float slope) {
  vec4 t;
  float d;

  d = destCoord().y * slope + distance;
  t = unpremultiply(sample(src, samplerCoord(src)));
  t = (t - d*color) / (1.0-d);

  return premultiply(t);
}

到目前为止,我在 MSL 中的功能是:

float4 MyFunc(sample_t image, float3 color, float dist, float slope) {
    float4 t;
    float d;
    
    d = color[1] * slope + dist
    ...
        
    return t;
}

如有任何帮助,我们将不胜感激!

这应该有效:

float4 MyFunc(sampler src, float4 color, float dist, float slope, destination dest) {
     const float d = dest.coord().y * slope + dist;
     float4 t = unpremultiply(src.sample(src.coord()));
     t = (t - d * color) / (1.0 - d);

     return premultiply(t);
}

注意 destination 参数。这是内核的一个可选的最后一个参数,它使您可以访问有关渲染目标的信息(例如您正在渲染到的目标坐标 space 中的坐标)。调用 CIKernel 时无需为此传递任何内容,Core Image 将自动填充它。

由于您只是在当前位置对输入 src 进行采样,因此您还可以将内核优化为 CIColorKernel。这些内核具有 1:1 输入到输出像素的映射。它们可以由 Core Image 运行时连接起来。内核代码如下所示:

float4 MyFunc(sample_t src, float4 color, float dist, float slope, destination dest) {
    const float d = dest.coord().y * slope + dist;
    float4 t = unpremultiply(src);
    t = (t - d * color) / (1.0 - d);

    return premultiply(t);
}

注意 sample_t(基本上是 float4)与 sampler.