微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将参数传递给 Metal CIWarpKernel?

如何解决如何将参数传递给 Metal CIWarpKernel?

我有一个简单的 Metal CIWarpKernel

    float2 MyWarp(destination dest,float offset)
    {
        return float2(dest.coord().x + offset,dest.coord().y);
    }

和:

class MyWarpFilter : CIFilter
{
    var inputimage: CIImage?
    var inputOffset: Float = 100.0

    static var kernel: CIWarpKernel =
    { () -> CIWarpKernel in
        let url = Bundle.main.url(forResource: "MyWarp",withExtension: "ci.Metallib")!
        let data = try! Data(contentsOf: url)
        return try! CIWarpKernel(functionName: "MyWarp",fromMetalLibraryData: data) <== ERROR
    }()

    override var outputimage : CIImage?
    {
        get
        {
            guard let input = inputimage else { return nil }

            let roiCallback: CIKernelROICallback =
            { _,rect -> CGRect in
                return CGRect(x: rect.minX,y: rect.minY,width: input.extent.width,height: input.extent.height)
            }

            let arguments: [Any] = [inputOffset]

            return MyWarpFilter.kernel.apply(extent: input.extent,roiCallback: roiCallback,image: input,arguments: arguments)
        }
    }
}

当我运行它时,我收到以下运行时错误(在上面用 <== ERROR 指示的行):

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Foundation._GenericObjCError.nilError

如果我删除第二个 MyWarp() 参数,使用 arguments: [] 运行过滤器并具有硬编码的偏移量,则没有错误(并且过滤器按偏移量转换图像)。

将参数传递给 CIWarpKernel 时我做错了什么?

解决方法

使用 iOS Simulator 14.4/Xcode 12.4 运行您的代码,我收到以下错误: (不确定我做错了什么,或者这只是运行时版本的问题。)

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=CIKernel Code=4 "(null)" UserInfo={CINonLocalizedDescriptionKey=If specified,destination must be the last parameter of a CIKernel function.}

所以,至少,您可能需要将参数 destination dest 移到最后:

    float2 MyWarp(float offset,destination dest)
    {
        return float2(dest.coord().x + offset,dest.coord().y);
    }

Metal Shading Language for Core Image Kernels

destination 一种内核参数类型,允许访问当前正在计算的像素的位置。此参数对于 CIWarpKernel 是必需的,对于 CIColorKernelCIKernel 是可选的,必须是内核函数的最后一个参数

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。