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

5
我有一个在Core Image核心语言中的函数,现在需要一个相当的Metal Shading语言版本,但是我在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;
}

非常感谢您的帮助!

1个回答

6
这应该可以工作:
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参数。这是一个可选的最后一个内核参数,它使您可以访问有关渲染目标(例如您正在呈现到的目标空间中的坐标)的信息。调用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 的区别。


我在哪里可以找到更多的编程示例,以了解使用CoreImage Metal Shading Language可能和不可能的内容?Apple的视频和参考文档都不够。https://developer.apple.com/metal/MetalCIKLReference6.pdf - Deepak Sharma
我可以推荐你查看Simon "FlexMonkey" Gladman的免费书籍"Core Image for Swift"。虽然代码示例仍使用旧的CI Kernel语言,但它们可以轻松地转换为Metal。重要的部分是他详细描述的核心图像概念和方法,在最近几年中并没有太大变化。https://books.apple.com/de/book/core-image-for-swift/id1073029980?l=en - Frank Rupprecht
这对于学习CoreImage内核来说是可以的,但我的观点是将Metal/GLSL片段/顶点着色器或计算着色器转换为Metal Core Image内核。我理解Metal Core Image内核具有太少的结构,并且与Metal编写的着色器不同。 - Deepak Sharma
嗯,除了WWDC的演讲,我还没有看到任何相关的资源。如果你在这里或者开发者论坛上发布具体问题,我也许能帮你解决。 - Frank Rupprecht

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接