【问题标题】:Convert Core Image Kernel Language function to Metal Shading Language将 Core Image Kernel Language 函数转换为 Metal Shading Language
【发布时间】:2020-10-28 05:40:44
【问题描述】:

我在 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;
}

任何帮助将不胜感激!

【问题讨论】:

    标签: c metal core-image cifilter metalkit


    【解决方案1】:

    这应该可行:

    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 金属着色语言可以做什么和不可以做什么? Apple 的视频以及参考文档是不够的。 developer.apple.com/metal/MetalCIKLReference6.pdf
    • 我可以推荐你看看 Simon "FlexMonkey" Gladman 的免费书籍 "Core Image for Swift"。尽管代码示例仍然使用旧的 CI 内核语言,但它们可以很容易地翻译成 Metal。重要的部分是他详细描述的 Core Image 概念和方法,近年来没有太大变化。 books.apple.com/de/book/core-image-for-swift/id1073029980?l=en
    • 这对于了解 CoreImage 内核很好,但我的意思是将 Metal/GLSL 片段/顶点着色器或计算着色器转换为 Metal Core Image 内核。我了解 Metal Core Image 内核的构造太少,与用 Metal 编写的着色器不同。
    • 嗯,是的,除了 WWDC 会谈之外,我还没有看到这方面的任何资源。如果您在此处或开发者论坛中发布特定问题,我可能会为您提供帮助。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多