提问者:小点点

如何向金属CiwarpKernel传递参数?


我有一个简单的金属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()参数,使用参数[]运行筛选器,并有一个硬编码的偏移量,就不会有错误(并且筛选器会按偏移量翻译图像)。

我向CiwarpKernel传递参数做错了什么?


共1个答案

匿名用户

用iOS模拟器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);
    }

核心图像内核的金属着色语言

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