首页 > 解决方案 > Metal:为 MSL cikernel 设置编译器和链接器选项后,.metal 文件中定义的 vertexFunction 变为 nil

问题描述

.metal 文件中定义的 VertexFunction 和 FragmentFunction 运行良好,但是一旦我按照Apple 的文档指定编译器和链接器选项,它们就变成了 nil :Other Metal Compiler Flags 选项中的 -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")

标签: swiftmetalcifiltercikernel

解决方案


我想您必须单独编译过滤器内核,而不是使用默认的 Metal 库。

为此,您可以例如给他们另一个文件扩展名,例如.kernel并添加自定义构建规则,如下所示:

在此处输入图像描述

然后添加一个自定义构建阶段,将编译的内核金属库复制到您的应用程序包中:

在此处输入图像描述

要使用正确的金属源初始化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)

(请注意,您应该再次从项目设置中删除编译器和 liker 标志,以使您的其他 Metal 源再次正确编译。)


推荐阅读