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

标签 swift metal cifilter cikernel

.metal 文件中定义的 VertexFunction 和 FragmentFunction 工作得很好,但是一旦我在 Apple's doc 后面指定了编译器和链接器选项,它们就变成了 nil。 :“其他 Metal 编译器标志”选项中的 -fcikernel 标志,以及用户定义设置中 MTLLINKER_FLAGS 中的 -cikernel flat。

我需要使用 MSL( Metal 着色语言)的 cikernel 进行上述设置。事实上,带有 Core Image Kernel Language 的 cikernel 在 12.0 中已被弃用。

如何同时使用顶点/片段 Metal 着色器和 MSL cikernel?

let library = self.device?.makeDefaultLibrary()!
let pipeLineDescriptor = MTLRenderPipelineDescriptor()
pipeLineDescriptor.vertexFunction=library.makeFunction(name: "myVertexShader")
pipeLineDescriptor.fragmentFunction=library.makeFunction(name: "myFragmentShader")

最佳答案

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

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

enter image description here

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

enter image description here

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

关于swift - Metal:一旦为 MSL cikernel 设置编译器和链接器选项,.metal 文件中定义的 vertexFunction 将变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391441/

相关文章:

ios - Xcode 7.3 : Can't import MetalKit

ios - 如何创建有限的 CIImage?

swift - Core Image 过滤后的图像从 iOS 10 上的 UIImageView 中跳出

swift - 我如何使用 RX 应用宽限时间?

swift - 在一定时间内从 UITextView 更改文本

ios - NSComparisonResult 在晚上 10 点及以上未按预期工作

swift - 为什么 Xcode 8.3.2 在编辑时不立即显示语法错误

macos - GLSL - 参数中的 `out`

iOS Metal Shader - 纹理读写访问?

ios - 如何将 CIFilter 应用于 UIView?