Core Image Metal 内核编译标志使 SwiftUI 找不到 Metal 着色器

问题描述 投票:0回答:1

我使用Core Image Metal内核,为了使其工作,需要将

-fcikernel
添加到构建设置中的
Other Metal Complie Flags
Other Metal Link Flags
。 这是谈论此问题的文章

但是添加flag之后 这里的金属着色器无法加载。

@available(iOS 17.0, macOS 14.0, watchOS 10.0, tvOS 17.0, visionOS 1.0, *)
internal struct GlurModifier: ViewModifier {
    public var radius: CGFloat
    public var offset: CGFloat
    public var interpolation: CGFloat
    public var direction: BlurDirection
    
    @Environment(\.displayScale) var displayScale
    
    let library = ShaderLibrary.default 
    
    var blurX: Shader {
        var shader = library.blurX(.float(radius),
                                   .float(offset),
                                   .float(interpolation),
                                   .float(Float(direction.rawValue)),
                                   .float(displayScale))
        shader.dithersColor = true
        return shader
    }

NSBundle ....simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MetalTools.framework/主体类为零,因为所有后备都失败了

swiftui metal core-image
1个回答
0
投票

找到了一个解决方法,似乎目标中的所有金属文件都会被构建到一个普通的

.metallib
库中。但添加
-fcikernel
使其适用于 CIKernel。我最终使用命令行构建了其中一个
.metallib

xcrun -sdk iphoneos metal -c -mios-version-min=15.0 blur.metal -o blur.air 

xcrun -sdk iphoneos metallib blur.air -o blur.metallib 

然后将输出文件添加到目标。

let library = ShaderLibrary(url: Bundle.main.url(forResource: "blur", withExtension: "metallib")!)

缺点是更新metal文件时必须手动构建,并且无法在模拟器上运行。猜猜更好的方法是将两个不同的金属源文件分离到框架中?

© www.soinside.com 2019 - 2024. All rights reserved.