.metal文件中定义的VertexFunction和FragmentFunction可以很好地工作,但是一旦我在Apple's doc之后指定了Compiler和Linker选项,它们就为零: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")

最佳答案

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

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

swift - Metal:为MSL cikernel设置编译器和链接器选项后,.metal文件中定义的vertexFunction变为nil-LMLPHP

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

swift - Metal:为MSL cikernel设置编译器和链接器选项后,.metal文件中定义的vertexFunction变为nil-LMLPHP

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

08-19 08:03