当前位置: 首页 > 知识库问答 >
问题:

如何向金属CiwarpKernel传递参数?

权承
2023-03-14

我有一个简单的金属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个答案

廉雅惠
2023-03-14

用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是可选的。

 类似资料:
  • 我尝试将参数从命令行传递到gradle。 我的身材是: 当我这样做时: 我得到这个: 我的问题是我应该为main提供什么?任何java文件包的名称?有具体的路径吗?什么应该是真正的源集?

  • 为了实现BrowserStack自动化,我已经将testNG与cucumber集成在一起,我希望在初始化浏览器之前为其设置功能。因此,当我通过testing.xml文件将功能作为参数传递给@before方法时,我会得到以下错误- *io.cucumber.java.invalidMethodSignatureException:用Before、After、BeforeStep或AfterStep注

  • 金属模式:金属参数 当使用 金属工作流程(相对于镜面工作流程)时,表面的发射率和光照通过金属度和平滑度修改。 当使用这种流程时,仍然会生成镜面反射,但是看起来是否真实,取决于设置的金属度和平滑度,而不是一个明确定义的开关。 金属模式不仅仅适用于看起来有金属质感的材质!这种模式之所以为称为金属模式,是因为你可以通过它控制物体表面的金属或非金属程度(译注:是否是金属或非金属,以及程度)。 金属参数 材

  • 问题内容: 在flask中,我可以这样做: 并且如果foo.html包含,页面将会显示。但是,如果有一条通往foo的路线怎么办: 在这种情况下,如果我仍然希望这种逻辑发生,那么进入foo.html的唯一方法是通过: 因此,如何使该变量传递到路由,这样我不必在加载路由之前重写重写该路由计算的逻辑代码? 问题答案: 你可以将消息作为显式URL参数传递(正确编码),也可以在重定向之前将消息存储到(coo

  • 问题内容: 我有一个詹金斯工作,带有“主动选择参数”和“主动选择反应参数”。 我试图调用詹金斯的工作,并使用管道脚本传递参数值。但是,我收到以下错误: 参数’ActiveChoicesParam’不具有App_Build期望的类型。转换为有效选择参数。 参数’ActiveChoicesReactiveParam’不具有App_Build期望的类型。转换为活动选择反应参数。 它们(Dev和Serve

  • 我正在使用Java Webstart运行一个应用程序,但它需要在使用Java9+运行时打开一个模块: