.metal 文件中定义的 VertexFunction 和 FragmentFunction 工作得很好,但是一旦我指定了以下编译器和链接器选项,它们就变成了 nil苹果的文档 https://developer.apple.com/documentation/coreimage/cikernel/2880194-kernelwithfunctionname:“其他金属编译器标志”选项中的 -fcikernel 标志,以及用户定义设置中 MTLLINKER_FLAGS 中的 -cikernel flat。
我需要使用 MSL(金属着色语言)对 cikernel 进行上述设置。事实上,带有 Core Image Kernel Language 的 cikernel 在 12.0 中已被弃用。
如何同时使用顶点/片段金属着色器和 MSL cikernel?
let library = self.device?.makeDefaultLibrary()!
let pipeLineDescriptor = MTLRenderPipelineDescriptor()
pipeLineDescriptor.vertexFunction=library.makeFunction(name: "myVertexShader")
pipeLineDescriptor.fragmentFunction=library.makeFunction(name: "myFragmentShader")
我想你必须单独编译过滤器内核,而不是使用默认的 Metal 库。
为此,您可以给它们另一个文件扩展名,例如.kernel
并添加自定义构建规则像这样:
然后添加自定义构建阶段将编译后的内核 Metallib 复制到您的应用程序包中:
初始化CIKernel
使用正确的金属源,您可以执行以下操作:
let url = Bundle(for: type(of: self)).url(forResource: "<#name of your .kernel file#>", withExtension: "metallib")!
let data = try! Data(contentsOf: url)
let kernel = try! CIKernel(functionName: "<#kernel function name#>", fromMetalLibraryData: data)
(请注意,您应该从项目设置中再次删除编译器和链接器标志,以使其他 Metal 源再次正确编译。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)