【发布时间】:2019-01-19 08:22:06
【问题描述】:
我正在开发一个小的 SceneKit 项目,我想使用 Metal Compute 管道以编程方式生成纹理以提高速度。我有一个基本的管道设置,可以生成一个 MTLTexture 并且它可以工作,但是一旦我将 SceneKit 框架添加到项目中,它就无法声明Function <X> was not found in the library。如果我删除对 SceneKit 的所有引用,它会再次起作用。
我必须从正确的 URL 实例化我的库,否则如果没有 SceneKit,它将无法工作。是什么阻碍了它?有没有办法解决这个问题,也许使用 SCNRenderer?
[编辑] 为更清楚起见,以下是我获取 MTLLibrary 引用的方法:
guard let url = Bundle.main.url(forResource: "MyLibrary", withExtension: "metallib") else {
throw GeneratorError.metalLibraryNotFound
}
library = device.makeLibrary(URL: url)
调用对象(连同MTLDevice)保留一个强引用,它是一个单例,所以它保留在内存中。为了获取内核函数本身,我调用以下函数,它返回适当的管道状态:
guard let function = library.makeFunction(name: functionName) else {
throw GeneratorError.functionNotFound(functionName)
}
return device.makeComputePipelineState(function: function)
就像我说的那样,在将 SceneKit 添加到项目之前,这工作正常 - 只需将框架添加到链接框架列表就足够了,我不必对它做任何事情 - 因此它根本找不到任何我的功能。
【问题讨论】:
-
您使用哪个 API 创建您的
MTLLibrary? -
不止一个?我刚刚将它作为金属库,在新项目菜单中的 iOS / Frameworks & Libraries 下。它有 cikernel 链接器标志,因为它作为过滤器库开始,但我已经尝试删除它,它有点让事情变得更糟。我认为可能缺少链接器标志,但找不到对 SceneKit 链接器的任何引用。我想我可以尝试回到主项目中的一个普通 Metal 文件?
-
他的意思是在你的应用代码中。您调用了哪些方法来获取对
MTLLibrary对象的引用? -
我已将其添加到票证中。